【问题标题】:Unable to retrieve a sub-NodeList from a NodeList in Javascript无法从 Javascript 中的 NodeList 检索子 NodeList
【发布时间】:2013-01-07 03:38:00
【问题描述】:

所以这里是交易:我试图从一个已经存在的 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"];

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

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

【问题讨论】:

  • 您的参考页面似乎有点令人困惑...无论如何,tagsdocument.all 返回的节点列表中的一个方法,这非常非常特定于 IE。 MDN: NodeList.
  • 我明白了。你有更好的参考页面推荐吗?此外,除了使用此标签方法之外,还有没有办法通过引用标签从另一个 NodeList 检索 NodeList?编辑:没关系,现在我意识到你已经发布了一个链接。我去看看。
  • 您可以逐个元素地迭代节点列表,并根据您需要的每个元素创建一个新的节点列表。 MDN是很好的参考,在主菜单点击Docs,你会发现更多的话题。

标签: javascript android xml cordova


【解决方案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;

就这些了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-13
    • 1970-01-01
    • 2019-11-26
    • 2013-11-20
    • 2019-11-21
    • 1970-01-01
    • 2020-09-09
    • 2021-03-14
    相关资源
    最近更新 更多