Pergunta

Eu estou usando um arquivo .dtd separado como um doctype para meu arquivo xml personalizado:

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

No entanto, quando tentar aceder names.xml eu recebo o seguinte erro:

XML erro de análise: entidade indefinida Localização: http: //localhost/.../names.xml Linha Número 5, Coluna 18:

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

Apenas para names.xml esclarecimento e names.dtd estão no mesmo diretório e usando http: // localhost /.../ names.dtd não quer trabalhar.

Este parece funcionar ao colocar o <!ENTITY dentro de um <!DOCTYPE em names.xml no entanto. Alguém pode aconselhar sobre isso?

Foi útil?

Solução

Se você estiver abrindo o documento no Firefox para tentar descobrir se você tem o DTD correto, não. O Firefox não passar o XML e DTD através de um parser XML adequada. Abra o documento XML no IE que fará com que o seu documento para ser passada através do analisador MSXML.

Ao abrir o documento XML no IE, ele irá lançar um erro sobre o seu DTD utilizando caracteres inválidos. Você precisa usar o código de caracteres para o eacute ao invés do próprio personagem. Aqui está o código que eu tenho que trabalhar ...

<?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>

e

<!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;">

Outras dicas

não carregar DTD externo (nem Safari; it < a href = "http://en.wikipedia.org/wiki/Comparison_of_layout_engines_(XML)#Schema_technologies" rel = "nofollow noreferrer"> parece com há navegadores fazem). Seu DTD e XML funcionam bem em xmllint se eu diga a ele para carregar DTDs externos:

$ 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>

Editar : Como pontos hsivonen nos comentários, usando DTDs para resolver entidades externas é um má idéia . Você geralmente não deve usar DOCTYPEs ou DTDs na web. Se você deseja validar um documento, você deve usar um esquema separado ( RELAX NG é recomendado para esta finalidade), e não um DTD embutido no próprio documento.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top