Usando um doctype com XML
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é</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é</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?
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é</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 "é">
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é</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.