Question

Un autre défi à la capacité XSD,
J'ai envoyé des fichiers XML par mes clients, ce qui va avoir 0 ou plus inattendus balises non définies ou [appel] (peut apparaître dans la hiérarchie). Eh bien, ils sont des balises redondantes pour moi .. j'ai donc appris à ignorer leur présence, mais avec eux il y a un certain ensemble de balises qui doivent être validées.

Ceci est un exemple de fichier 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, à cause de certaines raisons.
L'exemple mentionné ci-dessus est juste un échantillon. Le XML pratique est livré avec la hiérarchie complexe de balises XML ..

bien vouloir me faire savoir si vous pouvez obtenir un hack de celui-ci.

Par ailleurs, la solution alternative consiste à insérer XSL-transformation, avant le processus de validation. Eh bien, j'évite parce que je dois changer le code .Net qui déclenche le processus de validation, qui est supporté au moins par ma compagnie.

Était-ce utile?

La solution 2

Conclusion:

Ceci est impossible avec XSD. Toutes les approches que je tentais d'atteindre l'exigence ont été désignés comme « ambiguë » par la validation des outils, accompagnement tas d'erreurs.

Autres conseils

Dans le cas où vous n'êtes pas déjà fait avec cela, vous pouvez 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 libxml 20706.

Peut-être qu'il est possible d'utiliser les 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>

validera probablement.

Je fait face au même problème.

Depuis que j'ai appelé la validation de .NET; J'ai décidé de supprimer l'erreur de validation spécifique 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 doit être réglé à l'anglais ou CultureInfo.InvariantCulture pour le thread courant pour que cela fonctionne.

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

Utilisation de 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 » mode de contenu ouvert en haut de votre schéma:

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

  ...
</xs:schema>

Vous trouverez la spécification du W3C pour le contenu Ouvrir http: //www.w3 .org / TR / xmlschema11-1 / # et oc il y a une bonne writeup de ce http://www.ibm.com/developerworks/library/x-xml11pt3/#N102BA .

Malheureusement, .NET ne prend pas en charge XML 1.1 pour l'instant je ne peux pas trouver XML 1.1 gratuit processeurs - mais deux primes pour les options sont:

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top