Validierungswerkzeug für XML-Schema (XSD)? [geschlossen]

266

Im Büro schreiben wir derzeit eine Anwendung, die XML-Dateien für ein Schema generiert, das uns gegeben wurde. Wir haben das Schema in einer .XSD-Datei.

Gibt es Tools oder Bibliotheken, mit denen wir automatisierte Tests durchführen können, um zu überprüfen, ob das generierte XML mit dem Schema übereinstimmt?

Wir würden kostenlose Tools bevorzugen, die für den kommerziellen Gebrauch geeignet sind, obwohl wir den Schema-Checker nicht bündeln, sodass er nur von Entwicklern während der Entwicklung verwendet werden kann.

Unsere Entwicklungssprache ist C ++, wenn dies einen Unterschied macht, obwohl ich nicht denke, dass dies der Fall sein sollte, da wir die XML-Datei generieren und dann die Validierung durchführen könnten, indem wir im Test ein separates Programm aufrufen.

Jason Dagit
quelle
131
Ich
finde es toll,
1
Ich verstehe, woher es mit dem nicht konstruktiven kommt. Ehrlich gesagt, obwohl dies eine großartige Frage ist und Debatten / Argumente manchmal zu großartigen Antworten führen
Matt
22
Dies ist genau der Fall, in dem
Administratoren
Es lohnt sich vielleicht, eine ähnliche Frage im Zusammenhang mit dem Maven- Bauwerkzeug zu untersuchen.
Alberto
Versuchen Sie codverter.com/src/xmltoxsd
jonathana

Antworten:

239

Nach einigen Recherchen denke ich, dass die beste Antwort Xerces ist , da es XSD implementiert, plattformübergreifend ist und weit verbreitet ist. Ich habe ein kleines Java-Projekt auf github erstellt , um es über die Befehlszeile mit dem Standard-JRE-Parser zu überprüfen , der normalerweise Xerces ist. Dies kann unter Windows / Mac / Linux verwendet werden.

Es gibt auch eine C ++ - Version von Xerces , wenn Sie diese lieber verwenden möchten. Mit dem Dienstprogramm StdInParse können Sie es über die Befehlszeile aufrufen. Ein Kommentar unten verweist auf dieses vollständigere Wrapper-Dienstprogramm .

Sie können auch xmllint verwenden, das Teil von libxml ist . Möglicherweise haben Sie es bereits installiert. Anwendungsbeispiel:

xmllint --noout --schema XSD_FILE XML_FILE

Ein Problem ist, dass libxml nicht alle Spezifikationen implementiert, sodass möglicherweise Probleme auftreten :(

Wenn Sie unter Windows arbeiten, können Sie alternativ msxml verwenden , benötigen jedoch eine Art Wrapper, um es aufzurufen, z. B. die in diesem DDJ-Artikel beschriebene GUI . Es scheint jedoch, dass die meisten Windows-Benutzer einen XML-Editor verwenden, z. B. Notepad ++ (wie in Nates Antwort beschrieben ) oder XML Notepad 2007, wie von SteveC vorgeschlagen (es gibt auch mehrere kommerzielle Editoren, die ich hier nicht erwähne).

Schließlich werden Sie feststellen, dass verschiedene Programme leider unterschiedliche Ergebnisse liefern. Dies ist hauptsächlich auf die Komplexität der XSD-Spezifikation zurückzuführen. Möglicherweise möchten Sie Ihr Schema mit mehreren Tools testen.

UPDATE : Ich habe dies in einem Blog-Beitrag erweitert .

Adrian Mouat
quelle
1
Ich fand Folgendes hilfreich: jmvanel.free.fr/xsd/README.html
Matthew Hegarty
Ein Beispiel für die Verwendung von StdinParse (unter Linux) könnte nützlich sein: StdInParse -n -s -f -v = always <XML_FILE. XML_FILE sollte den Speicherort des Schemas enthalten. Für mich gibt es vollständigere Ergebnisse als xmllint.
Helcim
3
Gibt es eine Möglichkeit, ein Programm aufzufordern, xsi: schemaLocation zu verwenden, anstatt alle XSDs manuell zu füttern?
Gabor Garami
@GaborGarami Im Moment nicht, aber es ist eine Feature-Anfrage: github.com/amouat/xsd-validator/issues/5
Adrian Mouat
1
xmllintist leider nicht XML-Regex-kompatibel, so dass einige gültige XML-Regex nicht durchgelassen werden
Sergey Bushmanov
112

Es gibt ein Plugin für Notepad ++ namens XML Tools , das XML-Verifizierung und -Validierung gegen eine XSD bietet.

Wie Sie es verwenden können, können Sie hier sehen .

Nate
quelle
5
-1, dieses Plugin ist ein Schmerz zu installieren
jcollum
2
Ich habe mit npp 5.8.6, XMLTools 2.3.1 Unicode Beta2 R805 getestet, es funktioniert gut.
Palani
5
Tolles Plugin. Hilfe zur Installation finden Sie unter Notepad ++ XmlTools Not Installing .
Beladung
16
Und mit Version 5.8.7 macht der eigene Plugin Manager von Notepad ++ ("Plugins / Plugin Manager") den Installationsprozess automatisch.
Betankt
1
@FranzEbner Ich hatte das gleiche Problem. Wenn das XMLselbst beispielsweise auf eine XSDDatei verweist , xsi:noNamespaceSchemaLocation="file.xsd"versuchen XML Tools, diese zu verwenden, anstatt Ihnen einen "Set" -Dialog zu geben.
Theblang
22

xmlstarlet ist ein Befehlszeilentool, das dies und mehr erledigt :

$ xmlstarlet val --help
XMLStarlet Toolkit: Validieren von XML-Dokumenten
Verwendung: xmlstarlet val <Optionen> [<xml-Datei-oder-uri> ...]
wo <Optionen>
  -w oder - wohlgeformt - nur Wohlgeformtheit validieren (Standard)
  -d oder --dtd <dtd-Datei> - gegen DTD validieren
  -s oder --xsd <xsd-Datei> - Validierung anhand des XSD-Schemas
  -E oder --embed - validieren mit eingebetteter DTD
  -r oder --relaxng <rng-file> - Validierung anhand des Relax-NG-Schemas
  -e oder --err - ausführliche Fehlermeldungen auf stderr drucken
  -b oder --list-bad - listet nur Dateien auf, die nicht validiert werden
  -g oder --list-good - listet nur Dateien auf, die validiert werden
  -q oder --quiet - listet keine Dateien auf (nur Ergebniscode zurückgeben)

HINWEIS: XML-Schemas werden aufgrund ihrer Unvollständigkeit noch nicht vollständig unterstützt
      Unterstützung in libxml2 (siehe http://xmlsoft.org)

XMLStarlet ist ein Befehlszeilen-Toolkit zum Abfragen / Bearbeiten / Überprüfen / Transformieren
XML-Dokumente (weitere Informationen finden Sie unter http://xmlstar.sourceforge.net/)

Die Verwendung in Ihrem Fall erfolgt wie folgt:

xmlstarlet val --xsd your_schema.xsd your_file.xml
Charles Duffy
quelle
3
Wissen Sie, wie ernst die Warnung ist, XML-Schemas nicht vollständig zu unterstützen?
Jason Dagit
2
Nach anderen Antworten zu urteilen, ist xmlstarlet in seiner xsd-Implementierung etwas schwach.
Jason Dagit
3
Da xmlstarlet nur libxml2 unter der Haube verwendet, ist es wahrscheinlich einfacher, nur xmllint zu verwenden, das mit libxml2 gebündelt und in der akzeptierten Antwort erläutert wird.
Adrian Mouat
@ JasonDagit, ... es ist genau so schwach wie xmllint - sie verwenden dieselbe Bibliotheksimplementierung.
Charles Duffy
Das Inhaltsmodell ist nicht deterministisch. :-(
Greg
16

Für Windows gibt es den kostenlosen XML Notepad 2007 . Sie können XSDs auswählen, anhand derer sie validiert werden sollen

UPDATE: Besser noch, verwenden Sie Notepad ++ mit dem XML Tools Plugin

SteveC
quelle
3

Ich benutze Xerces:

http://xerces.apache.org/xerces-c/

John
quelle
1
Haben sie eine Befehlszeile, die von einer Konsole aus verwendet werden kann, um die Validierung einer XSLT-Datei anhand der XSD von XSLT 2.0 zu überprüfen?
Alexis Wilke
Ja, Sie können ein CLI-Tool mit installieren sudo apt install libxerces-c-samplesund dann das Dokument mit überprüfen StdInParse -v=always -n -s < document.xml.
Jgrocha
2

Ich lerne gerade Schema. Ich verwende RELAX NG und verwende xmllint zur Validierung. Ich bin frustriert über die Fehler von xmlllint. Ich wünschte, sie wären etwas informativer.

Wenn das XML ein falsches Attribut enthält, gibt xmllint den Namen des nicht unterstützten Attributs an. Wenn Sie jedoch ein Attribut im XML vermissen, erhalten Sie nur eine Meldung, dass das Element nicht validiert werden kann.

Ich arbeite an sehr kompliziertem XML mit sehr komplizierten Regeln, und ich bin neu in diesem Bereich. Daher dauert es lange, herauszufinden, welches Attribut fehlt.

Update: Ich habe gerade ein Java-Tool gefunden, das mir sehr gefällt. Es kann wie xmllint über die Befehlszeile ausgeführt werden und unterstützt RELAX NG: https://msv.dev.java.net/

Pengo
quelle
2

Ein XML-Editor für eine schnelle und einfache XML-Validierung finden Sie unter http://www.xml-buddy.com

Sie müssen nur das Installationsprogramm ausführen und können anschließend Ihre XML-Dateien mit einer benutzerfreundlichen Desktop-Anwendung oder der Befehlszeile überprüfen. Darüber hinaus erhalten Sie Unterstützung für Schematron und RelaxNG. Die Stapelvalidierung wird ebenfalls unterstützt ...

Update 13.01.2012: Das Befehlszeilentool ist kostenlos und verwendet Xerces als XML-Parser.

Clemens
quelle
1

Ein großartiges visuelles Werkzeug zum Validieren und Generieren von XSD aus XML ist IntelliJ IDEA, intuitiv und einfach.

Jacktrade
quelle
1

Sie können Ihr XML-Schema mit Intellisense von Microsoft Visual Studio verbinden. Diese Option bietet Ihnen sowohl eine Echtzeitvalidierung als auch eine automatische Vervollständigung, was einfach fantastisch ist.

Ich habe genau dieses Szenario auf meiner kostenlosen Kopie von Microsoft Visual C ++ 2010 Express.

Aaron Danielson
quelle
0

Ich neige dazu, xsd von Microsoft zu verwenden, um das xsd aus einer .NET-Datei zu generieren. Ich analysiere auch Abschnitte der XML mit xmlstarlet. Das letzte kostenlose Tool, das für Sie von Nutzen ist, ist altovaxml, das unter folgender URL verfügbar ist: http://www.altova.com/download_components.html .

Auf diese Weise kann ich alle XML-Dateien scannen und anhand der XML-Datei herausfinden, welche xsd verwendet werden soll.

# Function:
#    verifyschemas - Will validate all xml files in a configuration directory against the schemas in the passed in directory
# Parameters:
#    The directory where the schema *.xsd files are located.  Must be using dos pathing like: VerifySchemas "c:\\XMLSchemas\\"
# Requirements:
#    Must be in the directory where the configuration files are located
#
verifyschemas()
{
    for FILENAME in $(find . -name '*.xml' -print0 | xargs -0)
    do
        local SchemaFile=$1$(getconfignamefromxml $FILENAME).xsd
        altovaxml /validate $FILENAME /schema $SchemaFile > ~/temp.txt 2> /dev/null
        if [ $? -ne 0 ]; then
            printf "Failed to verify: "
            cat ~/temp.txt | tail -1 | tr -d '\r'
            printf "    - $FILENAME with $SchemaFile\n"
        fi
    done
}

Um die XML zu generieren, verwende ich: xsd DOTNET.dll / Typ: CFGCLASS & benenne schema0.xsd CFGCLASS.xsd um

Um den xsd-Namen zu erhalten, verwende ich: xmlstarlet sel -t -m / XXX / * -v lokaler Name () $ 1 | sed 's / $ //'

Auf diese Weise kann ich die richtige XSD mithilfe eines Element-Tags in der XML-Datei abrufen.

Das Nettoergebnis ist, dass ich eine Bash-Funktion aufrufen kann, um alle XML-Dateien zu scannen und zu überprüfen. Auch wenn sie sich in mehreren Unterverzeichnissen befinden.

Andrew Stern
quelle