2013-03-11 81 views
1

猜測這是一個JavaScript大師的簡單問題,但我正在學習,並且遇到了一個我無法猜測的問題。閱讀javascript中的XML屬性

我有興趣閱讀使用javascript的XML文件。這裏是一個XML文件的例子:

<object name='obj1'> 
    <attribute name='att1' value='val1'/> 
    <attribute name='att2' value='val2'/> 
    <attribute name='attN' value='valN'/> 
    <subobject name='sub1'> 
      <attribute name='satt1' value='sval1'/> 
      <attribute name='satt2' value='sval2'/> 
      <attribute name='sattN' value='svalN'/> 
    </subobject> 
    <subobject name='subn'> 
      <attribute name='snatt1' value='snval1'/> 
      <attribute name='snatt2' value='snval2'/> 
      <attribute name='snattN' value='snvalN'/> 
    </subobject> 
</object> 

正如你所看到的,我有N個對象。每個對象都具有全局屬性,並且可能有0 ... M個子對象及其屬性。

問題是,將這種(我的)代碼來解析OB1屬性,我還可以得到所有子對象的屬性:

if (window.XMLHttpRequest) {  
    var xmlhttp=new XMLHttpRequest(); 
    xmlhttp.open("GET",URL,false); 
    xmlhttp.send(); 

    var xmlDoc=xmlhttp.responseXML; 

    var objList = xmlDoc.getElementsByTagName("object"); 
    var attrList = objList[0].getElementsByTagName("attribute"); // Got ALL attributes here 
} 

在該代碼(爲簡單起見沒有錯誤的測試),我attrList對象獲得兩obj1和所有子對象屬性。

我該如何重寫代碼才能獲取att1 ... attN?!?!

在此先感謝!

回答

2

在,這種情況下,因爲你正在尋找attribute元素是object元素的直接孩子,你可以做一個簡單的事情是通過object元素的子元素通過手工迭代:

var obj = objList[0] 
var childNodes = obj.childNodes 
for(var i=0; i<childNodes.length; i++){ 
    var child = childNodes[i]; 
    if(child.nodeType == 1 && child.nodeName == 'attribute'){ 
     do_something(child); 
    } 
} 

有關這些和其他DOM方法的信息,我建議查看MDN上的文檔。

+0

大聲笑。之前看過類似的東西,但由於childNodes.length比N大,我認爲這是錯誤的。現在注意到,childNodes.length給出的是我總共擁有的屬性數,所以在我的XML中,每個節點都有2個屬性,childNodes.length是number_of_nodes * 2(number_of_nodes * attributes_in_each_node) 無論如何,在我的代碼中測試它,並且工作正常。謝謝!! – Ishmar 2013-03-11 02:04:08

+0

@Ishmar:childNodes.length可能關閉的原因是因爲它也會計算「子對象」節點,並且因爲在某些瀏覽器中,它也計算屬性元素之間的空白節點。 – hugomg 2013-03-11 02:06:38

0

您遇到的問題是技術上的子對象的「屬性」也是對象的子對象。請記住,任何元素都是一個Node對象,並且在該Node上可以獲得所有childNodes。你可以做到這一點,並處理每個「元素」節點,並確定它是否是「屬性」節點。

有關詳細信息,請參閱http://www.w3schools.com/jsref/dom_obj_node.asp