xmllint : die Validierung einer XML-Datei gegen zwei XSD-Schemata (Umschlag / Nutzlast)
Ich bin mit xmllint zu tun, einige Validierungen und ich habe eine XML-Instanz-Dokument die Validierung gegen zwei schemas: eine für die äußere "Hülle" (die ein alle element) und eine für den bestimmten Nutzlast. Sagen A. xsd ist der Umschlag schema, B. xsd Nutzlast-schema (es gibt verschiedene mögliche Nutzlasten) und ab.xml eine gültige XML-Instanz-Dokument (ich habe ein Beispiel am Ende des Beitrags).
Ich habe alle drei Dateien, die lokal im gleichen Verzeichnis und bin mit xmllint zur Durchführung der Validierung, da die schema argument die Position der äußeren (Umschlag) schema:
xmllint -schema A.xsd ab.xml
... aber, obwohl ich die Lage der beiden A. xsd und B. xsd in das Instanz-Dokument (mit der xsi:schemaLocation element) xmllint fehlschlägt, um es zu finden und beschwert sich:
ab.xml:8: element person: Schemas validity error : Element '{http://www.example.org/B}person': No matching global element declaration available, but demanded by the strict wildcard.
ab.xml fails to validate
Also anscheinend xmllint ist nicht das Lesen der xsi:schemaLocation element. Ich verstehe, dass xmllint kann konfiguriert werden, mit Katalogen, aber ich konnte nicht xmllint zu finden, die beide schemas. Wie sollte ich xmllint zu berücksichtigen, sowohl schemas bei der Validierung der Instanz-Dokument oder gibt es einen anderen Befehl Linie Dienstprogramm oder graphische tool könnte ich stattdessen verwenden?
SSCCE
A. xsd - Umschlag schema
<?xml version="1.0" encoding="UTF-8"?>
<schema elementFormDefault="qualified"
xmlns ="http://www.w3.org/2001/XMLSchema"
xmlns:a ="http://www.example.org/A"
targetNamespace ="http://www.example.org/A">
<element name="someType" type="a:SomeType"></element>
<complexType name="SomeType">
<sequence>
<any namespace="##other" processContents="strict"/>
</sequence>
</complexType>
</schema>
B. xsd - Nutzlast-schema
<?xml version="1.0" encoding="UTF-8"?>
<schema elementFormDefault="qualified"
xmlns ="http://www.w3.org/2001/XMLSchema"
xmlns:b ="http://www.example.org/B"
targetNamespace="http://www.example.org/B"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<element name="person" type="b:PersonType"></element>
<complexType name="PersonType">
<sequence>
<element name="firstName" type="string"/>
<element name="lastName" type="string"/>
</sequence>
</complexType>
</schema>
ab.xml - Instanz-Dokument
<?xml version="1.0" encoding="UTF-8"?>
<a:someType xmlns:a="http://www.example.org/A"
xmlns:b="http://www.example.org/B"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.example.org/A A.xsd
http://www.example.org/B B.xsd">
<b:person>
<b:firstName>Mary</b:firstName>
<b:lastName>Bones</b:lastName>
</b:person>
</a:someType>
InformationsquelleAutor der Frage Marcus Junius Brutus | 2013-06-08
Du musst angemeldet sein, um einen Kommentar abzugeben.
Kündigte ich auf xmllint und verwendet Xerces statt.
Ich heruntergeladen Xerces tarball und nach explodiert es zu einigen lokalen Ordner habe ich die folgenden überprüfen Skript (basierend auf dieser Vorschlag):
Den ab.xml Datei wird dann validiert, sowohl gegen die Schemata, mit dem folgenden Befehl:
Xerces Lesen des schema-Lokationen aus der xsi:schemaLocation element in ab.xmlso dass Sie nicht brauchen, um in den command-line Aufruf.
InformationsquelleAutor der Antwort Marcus Junius Brutus
Erstellen Sie eine wrapper-schema und importieren Sie die namespaces.
AB.xsd:
Dann:
InformationsquelleAutor der Antwort MarkBarry
Wenn Sie hatte eine
import
element in IhremA.xsd
direkt nach dem öffnen derschema
tag,dann könnte passieren
A.xsd
zuxmllint
und es würde funktionieren mit:InformationsquelleAutor der Antwort fiatjaf