Ich bin für meine benutzerdefinierte XML-Datei eine separate .dtd Datei als Doctype verwenden:Mit einem Doctype mit XML
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 "é">
Beim Versuch, auf names.xml zuzugreifen, erhalte ich jedoch die folgende Fehlermeldung:
XML Parsing Error: undefined entity Location: http://localhost/.../names.xml Line Number 5, Column 18:
<text>Pepé</text>
---------^
Nur zur Klarstellung names.xml und names.dtd sind im selben Verzeichnis und http://localhost/.../names.dtd entweder nicht funktioniert.
Dies scheint zu funktionieren, wenn Sie die <!ENTITY
innerhalb einer <!DOCTYPE
in names.xml
jedoch setzen. Kann jemand dazu beraten?
Sie können das Zeichen 'é' direkt im externen DTD-Betreff verwenden, wenn es OK codiert ist. Standardmäßig sollte es in UTF-8 sein; Sie können dies ändern, indem Sie eine "Textdeklaration" am oberen Rand der .dtd mit einer anderen "Codierung" einfügen. (Eine Textdeklaration entspricht im Wesentlichen der -Deklaration.) – bobince
Übrigens ist es für einen XML-Parser legal, externe Referenzen wie die externe DTD-Teilmenge nicht einzubeziehen, und es ist gut, dass Browser es auf Webseiten nicht zulassen da es Cross-Site-Scripting ermöglichen könnte. Was bei nicht deklarierten Entitätsreferenzen in diesem Fall passiert, ist implementierungsdefiniert. – bobince
Korrektur: Firefox verwendet einen korrekten XML-Parser, aber der Entity Resolver (die Sache, die System-IDs in Byte-Streams auflöst) wurde gehackt, um externe DTDs in Streams nullter Länge aufzulösen. – hsivonen