Использование doctype с XML - PullRequest
       14

Использование doctype с XML

3 голосов
/ 06 апреля 2009

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

names.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>

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 "é">

Однако при попытке доступа к names.xml я получаю следующую ошибку:

Ошибка синтаксического анализа XML: неопределенная сущность Место нахождения: http://localhost/.../names.xml Линия Номер 5, колонка 18:

<text>Pep&eacute;</text>
---------^

Только для пояснения names.xml и names.dtd находятся в одном каталоге и использование http://localhost/.../names.dtd также не работает.

Это, кажется, работает, если поместить <!ENTITY внутрь <!DOCTYPE в names.xml. Кто-нибудь может посоветовать по этому поводу?

Ответы [ 2 ]

2 голосов
/ 06 апреля 2009

Если вы открываете документ в Firefox, чтобы попытаться выяснить, правильно ли вы указали dtd, не делайте этого. Firefox не пропускает xml и dtd через правильный анализатор xml. Откройте свой XML-документ в IE, что приведет к его передаче через синтаксический анализатор MSXML.

При открытии XML-документа в IE будет выдано сообщение об ошибке с использованием недопустимых символов. Вы должны использовать код символа для каждого, а не сам символ. Вот код, который я получил на работу ...

<?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;">
2 голосов
/ 06 апреля 2009

Firefox не загружает внешние 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>

edit : Как указывает hsivonen в комментариях, использование DTD для разрешения внешних сущностей является плохой идеей . Как правило, вы не должны использовать DOCTYPE или DTD в Интернете. Если вы хотите проверить документ, вам следует использовать отдельную схему (для этой цели рекомендуется RELAX NG ), а не DTD, встроенный в сам документ.

...