xmllint: как проверить XML с использованием локального файла DTD

У меня есть локальный файл DTD test.dtd. Содержание это:

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

Я хотел бы проверить XML с помощью xmllint. В этом XML нет DOCTYPE:

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

Нет проблем, если я вставлю блок DTD в качестве второй строки в копию моего XML-файла и использую:

xmllint --valid --noout my2.xml

Но когда я пытаюсь:

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

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

оба не работают. Outout это:

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

Любая идея? Кажется, что мой XML ДОЛЖЕН содержать строку DOCTYPE (с ключевым словом SYSTEM) для ссылки на внешний файл DOCTYPE, которого я хочу избежать. Смотрите: http://www.w3schools.com/dtd/

Есть ли решение без изменения XML?

1 ответ

Решение

Прежде всего, внешние DTD не нуждаются в <!DOCTYPE преамбула - удалите ее из файла DTD:

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

Затем, --loaddtd извлекает внешний DTD, который не совпадает с проверкой внешнего DTD. Использовать --dtdvalid Вариант следующим образом:

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

Если документ XML действителен, xmllint не будет ничего выводить (из-за --noout). Если вы измените DTD на:

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

Выход будет

$ 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

Ищите дополнительную информацию на страницах документации NMT или XMLSoft.

Другие вопросы по тегам