nodeType 7 - "Knoten für Verarbeitungsanweisung"?
wahsaga
- javascript
hi,
um einen per XMLHTTPRequest geholten XHTML-Dokumentteil in ein bestehendes Dokument einzufügen wollte ich, um nicht stumpf .responseText über .innerHTML irgendwo reinzuklatschen, mir $E so anpassen, dass es das XML rekursiv durchläuft, und die entsprechenden Elemente erzeugt und einfügt.
Klappt auch ganz gut, in Browsern (Code siehe unten) - der IE weigerte sich zunächst hartnäckig, meldet einen Fehler "Typkonflikt" bei der Anweisung
el.appendChild(insertXML(XMLNode.childNodes[i]));
im letzten IF der Funktion.
Durch Debugausgaben (auskommentiertes alert()) bin ich dann darauf gestossen, dass FireFox und Opera mit als erstes Kindelement eines mit dem nodeName "div" und nodeType 1 liefern - der IE meldet mir davor aber noch einen Knoten "xml" vom Typ 7.
Wenn ich dann untiges IF, dass auf diesen Typ 7 abfragt, ent-kommentiere - dann funktioniert die Funktion auch im IE wie gewünscht.
Da er ganz zu Beginn der Funktion den XML-Dokumentknoten aber richtig als "#document" vom Typ 9 erkennt, wunderte ich mich, wo er dann "xml" Typ 7 herzaubert, den die anderen Browser nicht (er)kennen?
Laut SELFHTML ist 7 ein "Knoten für Verarbeitungsanweisung" - was habe ich mir darunter vorzustellen?
Die DOM Level 2 Core Specification nennt das Ding auf englisch analog PROCESSING_INSTRUCTION_NODE, also vom Typ Interface ProcessingInstruction.
Aber aus der Beschreibung dort werde ich auch nicht ganz schlau, was ich mir konkret darunter vorzustellen habe ...?
"The ProcessingInstruction interface represents a 'processing instruction', used in XML as a way to keep processor-specific information in the text of the document."
Der Javascript-Code der Funktion:
function insertXML (XMLNode) {
#var el;
if (XMLNode.nodeType == 9) {
el=document.createDocumentFragment();
}
else {
if (XMLNode.nodeType == 1) {
// Element erzeugen
el=document.createElement(XMLNode.nodeName);
// Attribute zuweisen
for (i=0,attr=XMLNode.attributes,l=attr.length; i<l; i++) {
// toLowerCase für Opera, der die Attributnamen aus dem XML in Großbuchstaben liefert,
// sie dann aber in dieser Schreibweise zugewiesen nicht akzeptieren mag
el[XMLNode.attributes[i].nodeName.toLowerCase()] = XMLNode.attributes[i].nodeValue;
}
}
else {
if (XMLNode.nodeType == 3) {
// Textknoten anlegen
el = document.createTextNode(XMLNode.data);
}
}
}
// rekursiver Aufruf für Kindknoten
if (XMLNode.hasChildNodes()) {
for (var i=0, c=XMLNode.childNodes.length; i<c; i++) {
//alert("Knotenname: "+XMLNode.childNodes[i].nodeName+"\nKnotentyp: "+XMLNode.childNodes[i].nodeType);
//if (XMLNode.childNodes[i].nodeType != 7) {
el.appendChild(insertXML(XMLNode.childNodes[i]));
//}
}
}
return el;
}
Beim Aufruf von XMLHTTPRequest zurückgeliefertes XML-Dokument für meinen Test:
<?xml version="1.0" encoding="utf-8"?>
<div>
<p>Der folgende Link führt zu <a href="http://example.com/" title="Link zu example.com"><strong>example.com</strong></a>, der <em>Beispiel-Domain</em> - jawohl!</p>
</div>
gruß,
wahsaga
Hi,
Durch Debugausgaben (auskommentiertes alert()) bin ich dann darauf gestossen, dass FireFox und Opera mit als erstes Kindelement eines mit dem nodeName "div" und nodeType 1 liefern - der IE meldet mir davor aber noch einen Knoten "xml" vom Typ 7.
<?xml version="1.0" encoding="utf-8"?>
<div>
<p>Der folgende Link führt zu <a href="http://example.com/" title="Link zu example.com"><strong>example.com</strong></a>, der <em>Beispiel-Domain</em> - jawohl!</p>
</div>
Jetzt mal zum selber-Raten: welcher Knoten könnte
1\. eine Processing-Instruction sein (kleiner Hinweis: diese stehen in <? ?>-Klammern)?
2\. mit dem schönen Namen xml versehen sein?
Die Tatsache, daß xml in allen möglichen Klein-Großschreibungen explizit als Name für eine Processing-Instruction ausgeschlossen wird (siehe <http://www.w3.org/TR/REC-xml/#sec-pi>), hält doch einen IE nicht davon ab, den entsprechenden Knoten im Baum dennoch als solche zu betrachten - wäre ja noch schöner, wenn der sich mal an einen Standard hielte ...
cu,
Andreas
--
[Warum nennt sich Andreas hier MudGuard?](http://www.Mud-Guard.de/)
[Schreinerei Waechter](http://www.schreinerei-waechter.de/)
[O o ostern ...](http://ostereier.andreas-waechter.de/)
Fachfragen unaufgefordert per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
hi,
Jetzt mal zum selber-Raten: welcher Knoten könnte
- eine Processing-Instruction sein (kleiner Hinweis: diese stehen in <? ?>-Klammern)?
Danke, der eingeklammerte Hinweis war eigentlich das, was mir zum Verständnis am ehesten fehlte.
Man könnte also bspw. <?php ... ?> als processing instruction bezeichen(?).
Die Tatsache, daß xml in allen möglichen Klein-Großschreibungen explizit als Name für eine Processing-Instruction ausgeschlossen wird (siehe http://www.w3.org/TR/REC-xml/#sec-pi), hält doch einen IE nicht davon ab, den entsprechenden Knoten im Baum dennoch als solche zu betrachten - wäre ja noch schöner, wenn der sich mal an einen Standard hielte ...
Ja, das ich vorher schrieb, mich zu "wundern", hätte ich eigetnlich gleich besser wissen sollen.
gruß,
wahsaga
Hallo wahsaga.
Man könnte also bspw. <?php ... ?> als processing instruction bezeichen(?).
Aus Sicht von XML, nein. Es ist lediglich Zufall, dass in PHP die Scriptbereiche ebenso wie XML-Verarbeitungsanweisungen gekennzeichnet werden.
Einen schönen Freitag noch.
Gruß, Ashura
Hi,
- eine Processing-Instruction sein (kleiner Hinweis: diese stehen in <? ?>-Klammern)?
Danke, der eingeklammerte Hinweis war eigentlich das, was mir zum Verständnis am ehesten fehlte.
Man könnte also bspw. <?php ... ?> als processing instruction bezeichen(?).
Naja, ist grenzwertig. PHP läßt ja z.B. - falls entsprechend konfiguriert - auch <?= $bla ?> oder <? echo $bla ?> zu - beides sind wegen ungültigem bzw. fehlendem Namen keine processing instructions
Eher sowas:
<?xml-stylesheet href="style.css" type="text/css">
cu,
Andreas