Hilfe bei doctype-Deklaration
Karl M.
- xml
Hallo,
ich habe ein XML-Dokument mit folgender Struktur:
<root>
<datensatz>
<id>1</id>
<spalteA>wertA</spalteA>
<spalteB></spalteB>
<spalteC>wertC</spalteC>
<!-- usw. -->
</datensatz>
<!-- weitere datensatz-Tags -->
</root>
dazu möchte ich die passende doctype-Deklration definieren, wobei der Knoten 'datensatz' beliebige weitere Nodes enthalten kann, diese dürfen vorkommen, müssen aber nicht, nur der Knoten ID muss vorhanden sein. Dazu habe ich folgendes versucht:
<!DOCTYPE mydoctype [
<!ELEMENT root (datensatz)+>
<!ELEMENT datensatz (ANY)> <!-- ANY ist hierfür wahrscheinlich falsch -->
<!ELEMENT id (#PCDATA)>
]>
ANY ist wahrscheinlich nur für den Inhalt einer Node gedacht. Gibt es auch etwas für beliebige Nodes?
Gruß,
Karl
Hellihello
wie wäre es denn mit
<spalte nr="A">contentA></spalte>
<!DOCTYPE mydoctype [
<!ELEMENT root (datensatz)+>
<!ELEMENT datensatz (ANY)> <!-- ANY ist hierfür wahrscheinlich falsch -->
<!ELEMENT id (#PCDATA)>
]>
>
> ANY ist wahrscheinlich nur für den Inhalt einer Node gedacht. Gibt es auch etwas für beliebige Nodes?
Wozu bräuchte es denn das in einer DTD?
Dank und Gruß,
[frankx](http://community.de.selfhtml.org/visitenkarten/view.php?key=82)
--
[tryin to](http://sauer-ernst.de) [multitain](http://multitain.de) - Globus = Planet != Welt
@@Karl M.:
<!DOCTYPE mydoctype /[
Nein. „Der Name in der Dokumenttyp-Deklaration muss mit dem Elementtyp des Wurzel-Elements übereinstimmen.“ [XML10 §2.8]
<!ELEMENT datensatz (ANY)> <!-- ANY ist hierfür wahrscheinlich falsch -->
Du müsstest auch sämtliche möglichen Kindelemente ('spalteA', 'spalteB', 'spalteC') in der DTD deklarieren: „Ein Element ist gültig, wenn es eine Deklaration gibt, die zu elementdecl passt, wobei der Name zu dem Elementtyp passt und eine der folgenden Bedingungen gilt: […] 4. Die Deklaration passt zu ANY, und die Typen aller Kind-Elemente sind deklariert worden.“ [XML10 §3]
Denkbar wäre sowas:
<!ELEMENT datensatz (id, spalteA?, spalteB?, spalteC?)>
[SELFHTML]
Unschön ist, dass die Elemente (sofern vorhanden) in der festgelegten Reihenfolge auftreten müssen.
Auch denkbar:
<!ELEMENT datensatz (id, (spalteA | spalteB | spalteC)*)>
Dann muss als erstes Kindelement 'id' kommen, danach die anderen in beliebiger Reihenfolge und Anzahl.
Auszudrücken, dass jeder Elementtyp maximal einmal, die Kindelemente aber in beliebiger Reihenfolge vorkommen dürfen, ist IIRC in einer DTD nicht möglich (außer durch Aufzählung aller möglichen Reihenfolgen). Mit einem XML Schema sollte auch das gehen.
Mich dünkt, 'id' könnte eher ein Attribut von 'datensatz' sein denn ein Kindelement.
Live long and prosper,
Gunnar