Utilizzando un doctype con XML
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é</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é</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?
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é</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 "é">
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é</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.