2015-03-16 2 views
9

У меня есть локальный файл DTD test.dtd. Содержание:xmllint: как проверить XML, используя локальный файл 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 как 2-й линии в копию моего файла XML и использование:

xmllint --valid --noout my2.xml 

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

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

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

обе не работают. Вывод:

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 MUST содержит строку DOCTYPE (с ключевым словом SYSTEM) для ссылки на внешний файл DOCTYPE, которого я хочу избежать. См.: http://www.w3schools.com/dtd/

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

+0

Каков результат этой команды? – hek2mgl

+0

Похоже, что что-то с DTD ошибочно. Не так ли? – hek2mgl

+0

Нет, потому что, когда я вставляю этот текст DTD в XML как есть, он работает. Может быть, мне нужна строка ввода в текстовом файле DTD? –

ответ

11

Прежде всего, внешние DTDs не нужно <!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 

Посмотрите для получения дополнительной информации о DOc страницах NMT или XMLSoft.

+0

Хороший ответ! ... – hek2mgl

+0

Спасибо. Но ничто не говорит о том, что «координация» является корневым элементом. –

+1

@EricH. Если вы думаете об этом, вам не нужно знать, какой элемент является корнем. Важно то, что вы, автор DTD, знаете, какой элемент является корневым элементом, и напишите для него правило. xmllint начинает синтаксический анализ XML-документа в корне, поэтому это правило будет в первую очередь применяться. –

Смежные вопросы