Discussion:
Erklärung zu ID und IDREF
(zu alt für eine Antwort)
Boris Glawe
2005-02-14 20:39:26 UTC
Permalink
Hallo,

wenn ich diverse Tutorials korrekt verstanden habe, dann betrachtet ein XML
Parser Attribute mit dem Namen "ID" und "IDREF" als etwas "besonderes" - diese
Attribute scheinen eine besondere Rolle zu spielen.

Wie aber wird (im allgemeinen) bei der Verarbeitung (ich arbeite mit xerces-c)
mit Elementen umgegangen, die dieses Attribute haben und man beabsichtigt, den
referenzierten Knoten weiter zu verarbeiten? Muss ich manuell all Knoten des
Baumes durchlaufen und jeweils schauen, ob sie erstens ein ID Attribut haben und
zweitens ob der Wert dieses Attributes meinem IDREF Attribut entsricht?
Das scheint mir insbesondere deshalb keine sinnvolle Lösung zu sein, weil diese
Attribute dadurch ihre Sonderrolle verlieren würden (solche Suchtechniken kann
ich mit jedem Attribut durchführen)

Ich habe in den DOM Spezifikationen keine Stellen gefunden, die mir bei diesem
Problem weiterhelfen.

also hier nochmal meine Frage in kurz: Wie komme ich über einen Knoten, der das
Attribut "IDREF" trägt, an den Knoten ran, der der durch dieses Attribut
referenziert wird?

Vielen Dank schon mal

Grüße Boris

P.S. hier das Beispiel, mit dem ich teste.

<?xml version="1.0" encoding="UTF-8" ?>

<test>
<elementOne ID="firstElement">hello world</elementOne>
<elementTwo IDREF="firstElement" />
</test>
Jürgen Kahrs
2005-02-14 21:28:34 UTC
Permalink
Post by Boris Glawe
wenn ich diverse Tutorials korrekt verstanden habe, dann betrachtet ein
XML Parser Attribute mit dem Namen "ID" und "IDREF" als etwas
"besonderes" - diese Attribute scheinen eine besondere Rolle zu spielen.
Nein. Du scheinst die Syntax von XML und die Syntax
der DTD durcheinander zu bringen.
Bernd Eckenfels
2005-02-14 21:42:42 UTC
Permalink
Post by Jürgen Kahrs
Nein. Du scheinst die Syntax von XML und die Syntax
der DTD durcheinander zu bringen.
Es gibt den ID und IDREF Typ. Oftmals wird aber ohne den zu verwenden davon
ausgegangen dass id und idref attribute entsprechenden typ haben.

Beim Umgang mit XML Instanzen haben die dann eine besondere Bedeutung bei
Tochter-Technologien wie XPointer oder SOAP.

In XML selbst haben die Attribute keine besondere Bedeutung sofern sie nicht
so definiert und vom validerer erkannt werden. Gewisse APIs erlauben in dem
Fall eine Navigation entlang der Verweise. (z.B. Document#getElementById aus
Java DOM).

Gruss
Bernd
Boris Glawe
2005-02-14 22:06:52 UTC
Permalink
Post by Bernd Eckenfels
Post by Jürgen Kahrs
Nein. Du scheinst die Syntax von XML und die Syntax
der DTD durcheinander zu bringen.
Es gibt den ID und IDREF Typ. Oftmals wird aber ohne den zu verwenden davon
ausgegangen dass id und idref attribute entsprechenden typ haben.
OK danke, das erklärt einiges! Ich muss also in der DTD dem Attribut mit dem
Namen "ID" (oder einem anderen frei wählbaren Namen) den Typ ID zuweisen.

Stoße ich auf ein Element mit einem Attribut vom *Typ* IDREF, dann kann ich das
Documentobjekt nutzen um das referenziert Element zu finden.

Stimmt das soweit? macht auf jeden Fall mehr Sinn, als das was ich zuvor
probiert habe :-)

Grüße Boris
Stefan Mintert
2005-02-15 09:50:16 UTC
Permalink
Post by Bernd Eckenfels
Es gibt den ID und IDREF Typ. Oftmals wird aber ohne den zu verwenden davon
ausgegangen dass id und idref attribute entsprechenden typ haben.
Beim Umgang mit XML Instanzen haben die dann eine besondere Bedeutung bei
Tochter-Technologien wie XPointer oder SOAP.
In XML selbst haben die Attribute keine besondere Bedeutung sofern sie nicht
so definiert und vom validerer erkannt werden. Gewisse APIs erlauben in dem
Fall eine Navigation entlang der Verweise. (z.B. Document#getElementById aus
Java DOM).
Hi Bernd,

mir liegt es fern ein Posting von Dir zu korrigieren, allerdings finde
ich Deine Aussage irreführend: Die *nicht getypten* Attribute mit den
jeweiligen Namen haben in der Tat keine besondere Bedeutung. Allerdings
verschweigst Du, dass die Attribute *mit* den entsprechenden Typen
bereits für XML (und nicht erst für irgendwelche Technologien
"dahinter") eine Bedeutung haben:

Zitat aus
http://edition-w3c.de/TR/2000/REC-xml-20001006/#sec-attribute-types
"Werte des Typs ID müssen zur Produktion Name passen. Ein Name darf
nicht mehr als einmal als Wert dieses Typs in einem XML-Dokument
erscheinen. Das heißt, ID-Werte müssen die Elemente, die sie tragen,
eindeutig identifizieren.
[...]
Werte des Typs IDREF müssen zur Produktion Name passen, und Werte des
Typs IDREFS müssen zur Produktion Names passen. Jeder Name muss mit dem
Wert eines ID-Attributs eines Elements im XML-Dokument übereinstimmen.
Das heißt, IDREF-Werte müssen zum Wert irgendeines ID-Attributs passen."

Das ist doch auch der Grund, weshalb Ingo früher in seinen Vorträgen
eine XML-Instanz gelegentlich als Graph und nicht als Baum visualisiert
hat; haben wir darüber nicht auch zu dritt auf der Konferenz in München
vor ein paar Jahren diskutiert...? Ich stimme bei der Idee mit dem
Graphen ja zu, allerdings nur, wenn man zwei Arten von Kanten zulässt ;-)


Viele Grüße, Stefan
--
www.mintert.com
www.edition-w3c.de - Web-Standards in deutscher Sprache
www.linkwerk.com - Software und Beratung für vernetzte Information
Bernd Eckenfels
2005-02-15 22:02:21 UTC
Permalink
Post by Stefan Mintert
Das ist doch auch der Grund, weshalb Ingo früher in seinen Vorträgen
eine XML-Instanz gelegentlich als Graph und nicht als Baum visualisiert
hat
Die ID Typen geben lediglich einen Typ vor (naemlich die erlaubten Zeichen
und den constraint der eindeutigkeit). Für XML instanzen selber ist die
zugehörige Semantik aber irgendwie nicht nutzbar. (man haette die Konvention
aus dem XML Standard weglassen können, das is ne SGML altlast).

ID/IDREF macht natürlich bei vielen Technologien sinn, aber dazu muesste es
nicht in der DTD stehen (stört da eher nur).

SOAP setzt darauf bei der Objekt serialisierung auf um aus Objektgraphen
zyklenfreie Bäume zu machen.

Aber klar ist definitionssache wo ein feature von XML anfaengt. Ich definier
das für mich mal als "alles wofuer SAX keine behandlung hat sind features
von anderen technologien" :)

Gruss
Bernd

Boris Glawe
2005-02-15 00:27:48 UTC
Permalink
Problem ist mit euren Antworten gelöst - Vielen Dank

Grüße Boris
Loading...