Frage

Eine weitere Herausforderung für die XSD-Fähigkeit,
Ich habe von meinen Kunden XML-Dateien wurde das Senden, die 0 werden mit werden oder mehr undefiniert oder [Aufruf] unerwartete Tags (in der Hierarchie erscheint Mai). Nun sind sie überflüssig Tags für mich .. so habe ich bekam ihre Anwesenheit zu ignorieren, aber zusammen mit ihnen gibt es einige Reihe von Tags, die validiert werden erforderlich sein.

Dies ist ein Beispiel 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>

Und die XSD Ich habe versucht, mit:

  <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 dies nicht zulässt, aus bestimmten Gründen.
Das oben genannte Beispiel ist nur ein Beispiel. Die praktische XML kommt mit der komplexen Hierarchie von XML-Tags ..

Bitte lassen Sie mich wissen, wenn Sie einen Hack davon bekommen kann.

Durch die Art und Weise, die alternative Lösung ist XSL-Transformation einzufügen, bevor Validierungsprozess. Nun, Ich vermeide es, weil ich den .Net-Code ändern muß, den Validierungsprozess auslöst, die am wenigsten von meiner Firma unterstützt wird.

War es hilfreich?

Lösung 2

Fazit:

Dies ist nicht möglich mit XSD. Alle Ansätze, die ich versuche, die Anforderung zu erreichen wurden genannt als „mehrdeutig“ durch die Validierung-Tools, Bündel von Fehlern begleitet.

Andere Tipps

Wenn Ihr nicht bereits mit diesem fertig, Sie könnten versuchen, die folgenden:

<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>

Unter Linux das funktioniert gut mit xmllint mit libxml Version 20706.

Vielleicht ist seine mögliche Namespaces zu verwenden:

<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>

Dies wird wahrscheinlich bestätigen.

ich vor dem gleichen Problem.

Da ich die Validierung von .NET genannt; Ich beschloss, die spezifischen Validierungsfehler in ValidationEventHandler als Behelfslösung. Er arbeitete für mich.

    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");
        }
    }

Es ist wichtig, dass Thread.CurrentUICulture auf Englisch oder CultureInfo.InvariantCulture für den aktuellen Thread eingestellt werden muss, damit dies funktioniert.

Sie könnten die Verwendung einer neuen Funktion in XML 1.1 genannte „Open Content“ machen. Kurz gesagt, können Sie angeben, dass zusätzliche „unbekannt“ Elemente eines komplexen Typs in verschiedenen Positionen hinzugefügt werden können, und was soll der Parser tun, wenn es eines dieser Elemente trifft

Mit XML 1.1, Ihr komplexen Typ würde:

<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>

Wenn Sie eine Menge von komplexen Typen haben, können Sie auch einen „default“ Open-Content-Modus an der Spitze Ihres Schemas festgelegt:

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

  ...
</xs:schema>
//www.w3:

Die W3C-Spezifikation für Open Content kann unter http finden .org / TR / xmlschema11-1 / # oc und es gibt eine gute Zuschreibung dieser in http://www.ibm.com/developerworks/library/x-xml11pt3/#N102BA .

Leider ist .NET nicht XML 1.1 als die noch unterstützen kann ich keine freien XML 1.1-Prozessoren finden - aber ein paar Bezahl-Optionen sind:

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top