2016-07-27 11 views
0

Ich versuche, eine einfache XML-Datei zu lesen, aber auf der einen Seite immer Null mit nodeValue und auf der anderen Seite bemerkte ein seltsames Verhalten auf den Kind-Knoten.xmlHttpRequest nodeValue immer null

Zuerst wird das seltsame Verhalten: Das ist mein xml:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<productList> 
<product> 
    <productname>Keilspanner</productname> 
    <artikelnummer>m12.123</artikelnummer> 
    <productid>2001</productid> 
    <objname>keilspanner</objname> 
    <length>6</length> 
    <width>5</width> 
    <height>2.5</height> 
</product> 
<product> 
    <productname>feste Backe</productname> 
    <artikelnummer>m12.456</artikelnummer> 
    <productid>3001</productid> 
    <objname>festeBacke</objname> 
    <length>6</length> 
    <width>4.4</width> 
    <height>2.5</height> 
</product> 
<product> 
    <productname>ClampRail</productname> 
    <artikelnummer>123</artikelnummer> 
    <productid>1001</productid> 
    <objname>clampRail</objname> 
    <length>40</length> 
    <width>5</width> 
    <height>5</height> 
</product> 
<product/> 
</productList> 

Wenn ich alle Knoten Kind von "Produkt" auszudrucken wie folgt aus:

for(i=0; i<=14; i++){ 
    console.log(xmlDoc.getElementsByTagName("product")[0].childNodes[i]); 
}; 

bekomme ich diese:

loadXML.js:22 #text 
loadXML.js:22 <productname>​Keilspanner​</productname>​ 
loadXML.js:22 #text 
loadXML.js:22 <artikelnummer>​m12.123​</artikelnummer>​ 
loadXML.js:22 #text 
loadXML.js:22 <productid>​2001​</productid>​ 
loadXML.js:22 #text 
loadXML.js:22 <objname>​keilspanner​</objname>​ 
loadXML.js:22 #text 
loadXML.js:22 <length>​6​</length>​ 
loadXML.js:22 #text 
loadXML.js:22 <width>​5​</width>​ 
loadXML.js:22 #text 
loadXML.js:22 <height>​2.5​</height>​ 
loadXML.js:22 #text 

Jeder zweite Wert ist eigentlich ein Kind meiner XML-Datei.

Zweite Ausgabe: Wenn ich nennen:

xmlDoc.getElementsByTagName("product")[0].childNodes[1].nodeValue; 

es immer null zurück.

Hier ist meine komplette js:

function readXml() { 


var xhttp = new XMLHttpRequest(); 
xhttp.onreadystatechange = function() { 
    if (xhttp.readyState == 4 && xhttp.status == 200) { 
     myFunction(xhttp); 
    } 
}; 
xhttp.open("GET", "xml/products.xml", true); 
xhttp.send(); 

} 

function myFunction(xml) { 
    var xmlDoc = xml.responseXML; 
    for(i=0; i<=14; i++){ 
     console.log(xmlDoc.getElementsByTagName("product")[0].childNodes[i]); 
    }; 

    console.log(xmlDoc.getElementsByTagName("product")[0].childNodes[1].nodeValue); 
} 

Hoffe ihr könnt mir helfen, ich bin neu in xml und ich bin gleich am Anfang Fehler: D

Antwort

1

Jeder zweite Wert ist eigentlich ein Kind meiner XML-Datei.

Jeder Wert ist ein Kindknoten des ersten Produktelements.

Jeder zweite Wert ist ein Kind Elementknoten. Die anderen sind Textknoten.

Sie haben Leerraum zwischen den Elementen. Leerraum ist Text. Text erstellt Knoten.

wenn ich rufe:

xmlDoc.getElementsByTagName("product")[0].childNodes[1].nodeValue; 

es immer null zurück.

Das ist zu erwarten. xmlDoc.getElementsByTagName("product")[0].childNodes[1] ist <productname>Keilspanner</productname>, die ein Elementknoten ist.

Die node value of an element is always null.

Wenn Sie den Text darin möchten, müssen Sie den Wert des Textknotens erreichen.

xmlDoc.getElementsByTagName("product")[0].childNodes[1].firstChild.nodeValue 
+0

Danke für die schnelle Antwort. Sie meinen also, der weiße Bereich in meiner XML-Datei wird tatsächlich durch eine schlechte Syntax verursacht? Oder ist das üblich und ich muss nur unebene Kinderzahlen verwenden, um meine Werte zu erhalten. – tinytree

+0

Es gibt nichts Schlechtes an der Syntax. Wenn Sie nur Elementknoten erhalten möchten, prüfen Sie den Knotentyp in der Schleife und 'continue', wenn es kein Element ist. – Quentin

+0

vielen dank, das sollte den Trick tun – tinytree