2015-03-16 4 views
9

Ich habe eine lokale DTD-Datei test.dtd. Inhalt ist:xmllint: Wie validiere ich ein XML mit einer lokalen DTD-Datei

<!DOCTYPE coord [ 
<!ELEMENT coord (date)> 
<!ELEMENT date (#PCDATA)> 
]> 

Ich möchte ein XML mit Xmllint validieren. Diese XML hat keine DOCTYPE drin:

<?xml version="1.0" encoding="x-mac-roman"?> 
<coord> 
    <date>20150312</date> 
</coord> 

Kein Problem, wenn ich den DTD-Block als zweite Zeile in eine Kopie meiner XML-Datei und die Nutzung ein:

xmllint --valid --noout my2.xml 

Aber wenn ich versuche:

xmllint --loaddtd test.dtd --valid --noout my.xml 

xmllint --dtdvalid test.dtd --noout my.xml 

beide funktionieren nicht. Das outout ist:

test.dtd:1: parser error : Content error in the external subset 
<!DOCTYPE coord [ 
^ 
test.dtd:1: parser error : Content error in the external subset 
<!DOCTYPE coord [ 
^ 
Could not parse DTD test.dtd 

Irgendwelche Idee? Es scheint, dass mein XML MUSS eine DOCTYPE-Zeile (mit Schlüsselwort SYSTEM) enthält, um auf die externe DOCTYPE-Datei zu verweisen, die ich vermeiden möchte. Siehe: http://www.w3schools.com/dtd/

Gibt es eine Lösung ohne Änderung der XML?

+0

Was ist die Ausgabe von diesem Befehl? – hek2mgl

+0

Es sieht so aus als wäre etwas mit der DTD falsch. Ist es nicht? – hek2mgl

+0

Nein, weil, wenn ich diesen DTD-Text in das XML einfügen, wie es ist, funktioniert es. Vielleicht brauche ich eine einführende Zeile in der DTD-Textdatei? –

Antwort

11

Zu allererst externen DTDs brauchen nicht die <!DOCTYPE Präambel - entfernen Sie sie aus der DTD-Datei:

<!ELEMENT coord (date)> 
<!ELEMENT date (#PCDATA)> 

Dann --loaddtdholt eine externe DTD, die nicht das gleiche wie ist Validieren gegen eine externe DTD. Verwenden Sie die Option --dtdvalid wie folgt:

$ xmllint --noout --dtdvalid test.dtd test.xml 

Wenn das XML-Dokument gültig ist, xmllint wird nicht ausgegeben, alles (wegen --noout). Wenn Sie die DTD zu ändern, sagen:

<!ELEMENT coord (date,other)> 
<!ELEMENT date (#PCDATA)> 

Der Ausgang

$ xmllint --noout --dtdvalid test.dtd test.xml 
test.xml:2: element coord: validity error : Element coord content does not follow the DTD, expecting (date , other), got (date) 
Document test.xml does not validate against test.dtd 

Geben Sie für weitere Informationen zu den doc Seiten von NMT oder XMLSoft sein wird.

+0

Gute Antwort! ... – hek2mgl

+0

Danke. Aber nichts sagt, dass "coord" das Wurzelelement ist. –

+1

@EricH. Wenn Sie darüber nachdenken, müssen Sie nicht wissen, welches Element die Wurzel ist. Wichtig ist, dass Sie, der Autor der DTD, wissen, welches Element das Wurzelelement ist, und eine Regel dafür schreiben. xmllint beginnt mit der Analyse eines XML-Dokuments im Stammverzeichnis, daher wird diese Regel als erste angewendet. –