Domanda

Io sto usando un file separato .dtd come doctype per il mio file XML personalizzato:

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

Tuttavia, quando si tenta di accedere names.xml ricevo il seguente errore:

  

errore di analisi XML: entità undefined   Posizione:    http: //localhost/.../names.xml Linea   Numero 5, Colonna 18:

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

Solo per chiarezza names.xml e names.dtd sono nella stessa directory e utilizzando http: // localhost /.../ names.dtd non funziona neanche.

Questo sembra funzionare quando mettere il <!ENTITY all'interno di una <!DOCTYPE in names.xml comunque. Qualcuno può consigliare su questo?

È stato utile?

Soluzione

Se si sta aprendo il documento in Firefox per cercare di scoprire se avete la DTD corretto, non lo fanno. Di Firefox non passa il codice XML e DTD attraverso una corretta parser XML. Aprire il documento XML in IE che farà sì che il documento può essere fatto passare attraverso il parser MSXML.

Quando si apre il documento XML in IE, si genera un errore sulla tua DTD utilizzando caratteri non validi. È necessario utilizzare il codice di carattere per l'eacute piuttosto che il carattere stesso. Ecco il codice che ho avuto modo di lavorare ...

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

Altri suggerimenti

non carica DTD esterno (né Safari, ma < a href = "http://en.wikipedia.org/wiki/Comparison_of_layout_engines_(XML)#Schema_technologies" rel = "nofollow noreferrer"> sembra non i browser). Il tuo DTD & XML lavoro bene in xmllint se dico che si carichi esterni 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>

modifica : Come hsivonen sottolinea nei commenti, utilizzando DTD per risolvere i soggetti esterni è un cattiva idea . Si consiglia di non utilizzare in genere DOCTYPE o DTD sul web. Se si desidera convalidare un documento, è necessario utilizzare uno schema separato ( RELAX NG è consigliato per questo scopo), e non una DTD incorporato nel documento stesso.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top