Comment ignorer la validation des tags inconnus?

un défi de plus pour la capacité XSD,



j'ai envoyé des fichiers XML par mes clients, qui auront 0 ou plus de balises non définies ou [call] inattendues (peut apparaître dans la hiérarchie). Ce sont des étiquettes redondantes pour moi .. je dois donc ignorer leur présence, mais avec eux, il y a un ensemble d'étiquettes qui doivent être validées.

ceci est un exemple de XML:

<root>
  <undefined_1>one</undefined_1>
  <undefined_2>two</undefined_2>
  <node>to_be_validated</node>
  <undefined_3>two</undefined_3>
  <undefined_4>two</undefined_4>
</root>

Et le XSD j'ai essayé avec:

  <xs:element name="root" type="root"></xs:element>
  <xs:complexType name="root">
    <xs:sequence>
      <xs:any maxOccurs="2" minOccurs="0"/>
      <xs:element name="node" type="xs:string"/>
      <xs:any maxOccurs="2" minOccurs="0"/>
    </xs:sequence>
  </xs:complexType

XSD ne permet pas cela, pour certaines raisons.

L'exemple mentionné ci-dessus est juste un exemple. Le XML pratique vient avec la hiérarchie complexe des étiquettes XML ..

dites-moi si vous pouvez obtenir un piratage.

soit dit en passant, la solution alternative est d'insérer la transformation XSL, avant le processus de validation. Eh bien, j'évite parce que je besoin de changer le code .Net qui déclenche le processus de validation, qui est pris en charge au moins par mon entreprise.

6
demandé sur InfantPro'Aravind' 2010-03-08 18:38:42

5 réponses

Conclusion:

ce n'est pas possible avec XSD. Toutes les approches que j'ai essayé d'atteindre l'exigence ont été nommées comme "ambiguës" par les outils de validation, accompagnant tas d'erreurs.

3
répondu InfantPro'Aravind' 2010-03-10 09:01:04

dans le cas où vous n'avez pas déjà fait avec cela, vous pourriez essayer ce qui suit:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="root" type="root"></xs:element>
  <xs:complexType name="root">
    <xs:sequence>
      <xs:any maxOccurs="2" minOccurs="0" processContents="skip"/>
      <xs:element name="node" type="xs:string"/>
      <xs:any maxOccurs="2" minOccurs="0" processContents="skip"/>
    </xs:sequence>
  </xs:complexType>
</xs:schema>

sous Linux cela fonctionne très bien avec xmllint en utilisant la version 20706 de libxml.

3
répondu alk 2011-11-16 08:03:06

peut-être est-il possible d'utiliser des espaces de noms:

<xs:element name="root" type="root"></xs:element> 
  <xs:complexType name="root"> 
    <xs:sequence> 
      <xs:any maxOccurs="2" minOccurs="0" namespace="http://ns1.com" /> 
      <xs:element name="node" type="xs:string"/> 
      <xs:any maxOccurs="2" minOccurs="0" namespace="http://ns2.com"/> 
    </xs:sequence> 
  </xs:complexType>

cela va probablement valider.

1
répondu W van Noort 2010-03-08 16:32:56

j'ai fait face au même problème.

puisque j'ai appelé la validation de .NET; j'ai décidé de supprimer l'erreur de validation spécifique dans ValidationEventHandler comme solution de contournement. Il a travaillé pour moi.

    private void ValidationEventHandler(object sender, ValidationEventArgs e)
    {
        switch (e.Severity)
        {
            case XmlSeverityType.Warning:
                // Processing warnings
                break;
            case XmlSeverityType.Error:
                if (IgnoreUnknownTags
                    && e.Exception is XmlSchemaValidationException
                    && new Regex(
                        @"The element '.*' has invalid child element '.*'\."
                        + @" List of possible elements expected:'.*'\.")
                       .IsMatch(e.Exception.Message))
                {
                    return;
                }
                // Processing errors
                break;
            default:
                throw new InvalidEnumArgumentException("Severity should be one of the valid values");
        }
    }

il est important que Thread.CurrentUICulture soit en anglais ou CultureInfo.InvariantCulture pour que le fil courant fonctionne.

1
répondu Andrej Adamenko 2014-10-07 21:24:59

vous pouvez utiliser une nouvelle fonctionnalité de XML 1.1 appelée"Open Content". En bref, vous permet de spécifier que des éléments "inconnus" supplémentaires peuvent être ajoutés à un type complexe dans diverses positions et ce que l'analyseur devrait faire si elle frappe l'un de ces éléments

en utilisant XML 1.1, votre type complexe deviendrait:

<xs:element name="root" type="root" />
<xs:complexType name="root"> 
  <xs:openContent mode="interleave">
    <xs:any namespace="##any" processContents="skip"/>
  </xs:openContent>

  <xs:sequence> 
    <xs:element name="node" type="xs:string"/> 
  </xs:sequence> 
</xs:complexType>

Si vous avez beaucoup de types complexes, vous pouvez également définir un "défaut" ouvrir le mode de contenu en haut de votre schéma:

<xs:schema ...>
  <xs:defaultOpenContent mode="interleave">
    <xs:any namespace="##any" processContents="skip"/>
  </xs:defaultOpenContent>

  ...
</xs:schema>

la spécification W3C pour le contenu ouvert se trouve à http://www.w3.org/TR/xmlschema11-1/#oc et il y a une bonne version de ça à http://www.ibm.com/developerworks/library/x-xml11pt3/#N102BA .

malheureusement, .NET ne supporte pas XML 1.1 Pour l'instant je ne trouve pas de processeurs XML 1.1 gratuits - mais quelques options payantes sont:

0
répondu Colin Smith 2015-09-23 12:42:56