无法从Javascript中的NodeList检索子NodeList

时间:2013-01-23 15:39:40

标签: javascript android xml cordova

所以这是交易:我正在尝试从已经存在的NodeList中检索NodeList对象。这是一个简化的XML示例:

<products>
  <category>
  <name>Category A</name>
    <product>
      <code>1</code>
      <name>Product 1 Category A</name>
      <price>10.0</price>
    </product>
    <product>
      <code>2</code>
      <name>Product 2 Category A</name>
      <price>20.0</price>
    </product>
  </category>
  <category>
  <name>Category B</name>
    <product>
      <code>3</code>
      <name>Product 1 Category B</name>
      <price>5.0</price>
    </product>
    ...
  </category>
</products>

如您所见,标记名称出现两次,一次作为类别的子节点,再次作为产品的子节点。我希望只检索产品名称。由于我无法从XML文件中读取而是将其作为字符串接收,因此这是我的解析函数:

function parseXML(xmlString) {
    var parser = new DOMParser();
    var xmlDoc = parser.parseFromString(xmlString, "text/xml");
    var products = xmlDoc.getElementsByTagName("product");
    var names = products.tags("name"); //Here's my problem
    for(var i = 0; i < names.length; i++){
        var element = names[i];
        var name = element.firstChild;
        $('#div_products').append(name.data + "<br>");  
    }
    $('#div_main').html($('#div_products').html());
}       

这就是我用作参考的内容:http://help.dottoro.com/ljtrjxbf.php。但是,使用nodeListObject.tags(“tag”)将产生以下错误:

processMessage failed: Stack: TypeError: Object #<a NodeList> has no method 'tags'

我尝试了不同的方法,但没有任何效果。甚至

var names = products["name"];

返回“undefined”,这在任何情况下对我都不起作用,因为文档说除了IE之外,它只返回第一个节点和 A)我正在使用Android / Cordova和 B)无论如何,节点中没有属性“name”。

那么我该如何解决这个问题呢?我想我可以尝试从产品NodeList创建一个新的XMLDocument对象,但我还没有调查它,因为它必须有一个更简单的方法来解决这个问题。

1 个答案:

答案 0 :(得分:1)

谢谢Teemu,我已经设法通过我的Javascript代码中的一些调整来实现我想要的。我会在这里发布,以便将来有人可能会发现它有用:

function parseXML(xmlString) {
    var NAME = 5; 
    var parser = new DOMParser();
    var xmlDoc = parser.parseFromString(xmlString, "text/xml");
    var products = xmlDoc.getElementsByTagName("product");

    for(var i = 0; i < products.length; i++){
        var nodeList = produtos[i].childNodes;
        $('#div_products').append(nodeList[NAME].textContent + "<br>");
    }

    $('#div_main').html($('#div_products').html());
} 

请注意,5是我想要的DOM TextNode的索引(产品名称本身),因此:

var NAME = 5;

这就是全部。