Pregunta

Estoy usando un archivo separado .dtd como un tipo de documento para mi archivo 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 "é">

Sin embargo cuando se trata de acceder names.xml me sale el siguiente error:

  

error de análisis XML: entidad sin definir   Ubicación:    http: //localhost/.../names.xml Línea   Número 5, Columna 18:

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

Sólo por names.xml aclaración y names.dtd se encuentran en el mismo directorio y utilizando http: // localhost /.../ names.dtd no funciona bien.

Esto parece funcionar al poner el <!ENTITY dentro de un <!DOCTYPE en names.xml sin embargo. ¿Alguien puede aconsejar sobre esto?

¿Fue útil?

Solución

Si va a abrir el documento en Firefox para tratar de averiguar si usted tiene la DTD correcta, no lo hacen. Firefox no pasa el XML y DTD a través de un analizador XML adecuado. Abra el documento XML en el IE lo que hará que el documento que se pasa a través del analizador MSXML.

Al abrir el documento XML en IE, se generará un error acerca de su DTD usando caracteres no válidos. Es necesario utilizar el código de caracteres para el eacute más que el personaje en sí. Aquí está el código que tengo que trabajar ...

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

y

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

Otros consejos

no se carga DTD externa (tampoco Safari, sino que < a href = "http://en.wikipedia.org/wiki/Comparison_of_layout_engines_(XML)#Schema_technologies" rel = "nofollow noreferrer"> parece que no hay hacen los navegadores). Su DTD y XML trabajo fino en xmllint si le digo que cargue DTD externas:

$ 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 hsivonen señala en los comentarios, utilizando DTD para resolver entidades externas es un mal idea. En general, usted no debe usar DOCTYPE o DTD en la web. Si desea validar un documento, debe utilizar un esquema separado ( RELAX NG se recomienda para este fin), y no es un DTD incrustada en el propio documento.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top