Вопрос

Я использую отдельный файл .dtd в качестве типа документа для своего XML-файла:

имена.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE name SYSTEM "names.dtd">
<names>
    <name>
        <text>Pep&eacute;</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&eacute;</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&eacute;</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 "&#233;">

Другие советы

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&eacute;</text>
        <creator>&lost;</creator>
        <history>&lost;</history>
    </name>
    <name>
        <text>Charles</text>
        <creator>James</creator>
        <history>&lost;</history>
    </name>
</names>

редактировать:Как отмечает Хсивонен в комментариях, использование DTD для разрешения внешних объектов является плохая идея.Обычно не следует использовать DOCTYPE или DTD в Интернете.Если вы хотите проверить документ, вам следует использовать отдельную схему (РАССЛАБИТЬСЯ НГ рекомендуется для этой цели), а не DTD, встроенный в сам документ.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top