Использование типа документа с XML
Вопрос
Я использую отдельный файл .dtd в качестве типа документа для своего XML-файла:
имена.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE name SYSTEM "names.dtd">
<names>
<name>
<text>Pepé</text>
<creator>&lost;</creator>
<history>&lost;</history>
</name>
<name>
<text>Charles</text>
<creator>James</creator>
<history>&lost;</history>
</name>
</names>
имена.dtd
<!ELEMENT name (text, creator+, history)>
<!ELEMENT text (#PCDATA)>
<!ELEMENT creator (#PCDATA)>
<!ELEMENT history (#PCDATA)>
<!-- Placeholder/unknown history or creator name -->
<!ENTITY lost "Lost in the depths of time.">
<!ENTITY eacute "é">
Однако при попытке доступа к name.xml я получаю следующую ошибку:
Ошибка синтаксического анализа XML:Неопределенное расположение сущности: http://localhost/.../names.xml Строка № 5, столбец 18:
<text>Pepé</text>
---------^
Просто для пояснения, имена.xml и имена.dtd находятся в одном каталоге и используют http://localhost/.../names.dtd тоже не работает.
Кажется, это работает при установке <!ENTITY
внутри <!DOCTYPE
в names.xml
однако.Может ли кто-нибудь посоветовать по этому поводу?
Решение
Если вы открываете документ в Firefox, чтобы проверить, правильный ли у вас dtd, не делайте этого.Firefox не передает xml и dtd через соответствующий анализатор xml.Откройте свой XML-документ в IE, после чего ваш документ будет пропущен через анализатор MSXML.
При открытии XML-документа в IE выдается ошибка о вашем DTD с использованием недопустимых символов.Вам нужно использовать код символа для eacute, а не сам символ.Вот код, который мне нужен для работы...
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE NAME SYSTEM "names.dtd">
<names>
<name>
<text>Pepé</text>
<creator>&lost;</creator>
<history>&lost;</history>
</name>
<name>
<text>Charles</text>
<creator>James</creator>
<history>&lost;</history>
</name>
</names>
и
<!ELEMENT name (text, creator+, history)>
<!ELEMENT text (#PCDATA)>
<!ELEMENT creator (#PCDATA)>
<!ELEMENT history (#PCDATA)>
<!ENTITY lost "Lost in the depths of time.">
<!ENTITY eacute "é">
Другие советы
Fire Fox не загружает внешние DTD (как и Safari;это выглядит как никакие браузеры этого не делают).Ваши DTD и XML отлично работают в xmllint, если я скажу ему загружать внешние DTD:
$ xmllint --loaddtd names.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE names SYSTEM "names.dtd">
<names>
<name>
<text>Pepé</text>
<creator>&lost;</creator>
<history>&lost;</history>
</name>
<name>
<text>Charles</text>
<creator>James</creator>
<history>&lost;</history>
</name>
</names>
редактировать:Как отмечает Хсивонен в комментариях, использование DTD для разрешения внешних объектов является плохая идея.Обычно не следует использовать DOCTYPE или DTD в Интернете.Если вы хотите проверить документ, вам следует использовать отдельную схему (РАССЛАБИТЬСЯ НГ рекомендуется для этой цели), а не DTD, встроенный в сам документ.