PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Javascript XML verarbeiten


rotalever
2010-01-02, 17:52:24
Hi,
wenn ich einen XMLHttpRequest mache, bekomme ich ja über .responseXML XML Dom zurück.
Wenn das zum Beispiel so aussieht:
<?xml version="1.0" encoding="utf-8"?>
<myxml>
<name>a</name>
<name>b</name>
<tag>
<name>c</name>
</tag>
</myxml>
Und ich jetzt alle Namen haben will, würde ich ja zum Beispiel sowas machen:

var doc = ajax.responseXML;
var namen = doc.getElementsByTagName("test")
for (var i = 0; i < namen.length; ++i)
{
alert(namen.item(i).firstChild.data);
}


Jetzt will ich aber den Namen c nicht haben. getElementsByTagName gibt mir aber leider immer alle Tags im kompletten Subtree zurück. Kann man in Javascript (Firefox reicht) auch irgendwie anders auf das XML zugreifen?
In PHP kann ich zum Beispiel mit SimpleXML so auf das XML zugreifen, dass ich immer den kompletten Pfad angebe.
Zum Beispiel

$xml->name[0], $xml->name[1]
oder $xml->tag->name[0]

DanMan
2010-01-02, 18:58:29
for (var i = 0; i < namen.length; ++i)
{
if (namen.item(i).parentNode.tagName !='tag') {
alert(namen.item(i).firstChild.data);
}
}
...könnte klappen. Du verwendest einfach das DOM (http://de.wikipedia.org/wiki/Document_Object_Model).

rotalever
2010-01-02, 20:47:41
Ok, das ist zwar etwas umständlich müsste aber irgendwie gehen. Im allgemeinen Fall, also wenn ich nicht genau weiß wie das XML aufgebaut ist, sondern nur einzelne "Tag-Pfade" extrahieren möchte, müsste ich dann allerdings immer alle parents überprüfen.

DanMan
2010-01-02, 20:59:35
Ok, das ist zwar etwas umständlich müsste aber irgendwie gehen. Im allgemeinen Fall, also wenn ich nicht genau weiß wie das XML aufgebaut ist, sondern nur einzelne "Tag-Pfade" extrahieren möchte, müsste ich dann allerdings immer alle parents überprüfen.
Hast du denn keine Kontrolle über das XML? Sonst könntest du doch einfach deinen Elementen Attribute vergeben, und dann danach filtern.

Bin mir nicht sicher, aber ich glaube die ein oder andere JS-Library (jQuery?) könnte vielleicht sowas wie XPath bereitstellen. Damit kannst du dann auch direkte Pfade angeben.

Edit: sehe gerade, dass Firefox das wohl auch so schon kann (https://developer.mozilla.org/en/Introduction_to_using_XPath_in_JavaScript).

rotalever
2010-01-02, 22:14:00
Hast du denn keine Kontrolle über das XML? Sonst könntest du doch einfach deinen Elementen Attribute vergeben, und dann danach filtern.
Leider nicht, da die XMLs von verschiedenen Webservicen kommen.


Bin mir nicht sicher, aber ich glaube die ein oder andere JS-Library (jQuery?) könnte vielleicht sowas wie XPath bereitstellen. Damit kannst du dann auch direkte Pfade angeben.

Edit: sehe gerade, dass Firefox das wohl auch so schon kann (https://developer.mozilla.org/en/Introduction_to_using_XPath_in_JavaScript).
Danke. Werde mir das mal anschauen und berichten ob es damit klappt.

DanMan
2010-01-02, 23:39:19
Wenns nur in Ff laufen soll, dann kannst du auch document.querySelectorAll (https://developer.mozilla.org/En/DOM/Document.querySelectorAll) benutzen. Damit könntest du dann sowas machen:
var el = document.querySelectorAll("name *:not(tag)");
Mit einer JS-Library geht das aber auch browserübergreifend.

rotalever
2010-01-03, 20:48:45
Ich werde jetzt XPath verwenden. Scheint ganz gut zu sein. :smile: