使用JavaScript和XML通过索引获取元素名称

时间:2014-02-12 14:19:21

标签: javascript ajax xml

如果我不知道元素名称,如何从XML文档中访问元素。

<test_data>
    <title>test data</title>
        <test id="1">
             <test_1>
                 <example_1>Example 1 Text</example_1>
                 <example_2>Example 2 Text</example_2>
                 <example_3>Example 3 Text</example_3>
             </test_1>
        </test>
        <test id="2">
             <test_2>
                 <example_1>Example 1 Text</example_1>
                 <example_2>Example 2 Text</example_2>
                 <example_3>Example 3 Text</example_3>
             </test_2>
        </test>
        <test id="3">
             <test_3>
                 <example_1>Example 1 Text</example_1>
                 <example_2>Example 2 Text</example_2>
                 <example_3>Example 3 Text</example_3>
             </test_3>
        </test>
</test_data>

如何访问元素“test_1”,“test_2”,“test_3”。在实践中,我不会知道这些元素的名称,但我会知道索引。

我不能使用getElementsByTagName,因为此名称对于此元素是动态的。我想检索节点名称。

我已尝试以下方法来检索元素。

x = xmlhttp.responseXML.documentElement.getElementsByTagName("test");
x[0].firstChild.nodeName;

这将返回#text而不是节点名称。

有什么建议吗?

1 个答案:

答案 0 :(得分:0)

Plunker Demo

JS

var xml = "<test_data><title>test data</title><test id='1'><test_1><example_1>Example 1 Text</example_1><example_2>Example 2 Text</example_2><example_3>Example 3 Text</example_3></test_1></test><test id='2'><test_2><example_1>Example 1 Text</example_1><example_2>Example 2 Text</example_2><example_3>Example 3 Text</example_3></test_2></test><test id='3'><test_3><example_1>Example 1 Text</example_1><example_2>Example 2 Text</example_2><example_3>Example 3 Text</example_3></test_3></test></test_data>";

if (window.DOMParser)
{
  parser=new DOMParser();
  xmlDoc=parser.parseFromString(xml,"text/xml");
}
else // Internet Explorer
{
  xmlDoc=new ActiveXObject("Microsoft.XMLDOM");
  xmlDoc.async=false;
  xmlDoc.loadXML(xml); 
}

var x=xmlDoc.getElementsByTagName("test");
console.log(x);

for (i=0;i < x.length; i++){
  console.log(x[i].childNodes[0].nodeName);
}