Wie die Validierung von Unknown Tags ignorieren?
-
18-09-2019 - |
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.
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: