【问题标题】:Text node not being identified by DOMParser (javascript)DOMParser (javascript) 未识别文本节点
【发布时间】:2013-01-25 17:25:29
【问题描述】:

我遇到了一个非常不寻常的问题。如有必要,为了更好地了解大局,请参考我的上一篇文章,Unable to retrieve a sub-NodeList from a NodeList in Javascript

嗯,现在可以了,但是当我尝试使用基本相同的方法解析不同的 XML 字符串时,生成的 NodeList 将不包含任何文本节点。我将尝试解析的字符串的一部分发布到 NodeList 中,而不是格式化的 XML:

<clients><client><code>1111</code><crm>2222</crm><company><name>FOO</name><enterprise>BAR</enterprise><cnpj>XXX</cnpj></company></client></clients>

请注意,这些不是节点的实际值,但父节点客户端遵循此结构(虽然它被删节了)。

因此,出于测试目的,我最终使用以下代码来查看列表是否正确创建:

function parseClientsXML(xmlString, filter){
    var parser = new DOMParser();
    var xmlDoc = parser.parseFromString(xmlString, "text/xml");
    var clients = xmlDoc.getElementsByTagName(filter);

    for(var i = 0; i < clients.length; i++){
        var client = clients[i].childNodes;
        for (var j = 0; j < client.length; j++){
            var node = client[j];
            $('#div_clients').append("Node index: " + i + " - Type: " + node.nodeType + " - Name: " + node.nodeName + "<br>");
        }
    }

调用函数:

parseXML(theString, "clients");

我预期的结果是这样的:

Node index: 0 - Type: 1 - Name: client
Node index: 1 - Type: 1 - Name: code
Node index: 2 - Type: 3 - Name: #text
Node index: 3 - Type: 1 - Name: crm
Node index: 4 - Type: 3 - Name: #text

等等。使用从我的另一篇文章中的 XML 解析的字符串作为“theString”,它可以正常工作。但是这篇文章中字符串的输出是这样的:

Node index: 0 - Type: 1 - Name: client
Node index: 1 - Type: 1 - Name: code
Node index: 2 - Type: 1 - Name: crm
Node index: 3 - Type: 1 - Name: company
Node index: 4 - Type: 1 - Name: name
...

我整天都在研究这个问题,但找不到解决方案。输入字符串与我在上面发布的完全一样(嗯,不完全是,但很接近)。有什么想法吗?

【问题讨论】:

  • 明天如果没有其他人会尝试解决这个问题,对不起。

标签: javascript xml dom


【解决方案1】:

按照承诺解决您的问题。

function parseClientsXML(xmlString, filter) {
    var parser = new DOMParser();
    var xmlDoc = parser.parseFromString(xmlString, "text/xml");

    (function output(node, filter) {
        var child;
        var children = node.childNodes.length;

        if (filter === "") {
            $('#div_clients').append(node.nodeType + " : " + node.nodeName + "<br>");
        } else {
            filter = node.nodeName === filter ? "" : filter;
        }

        for (child = 0; child < children; child += 1) {
            output(node.childNodes[child], filter);
        }
    }(xmlDoc, filter));
}

【讨论】:

  • 谢谢,我稍后会尝试并尽快给您一些反馈! =)
  • 它工作得很好,瑞安,谢谢。顺便说一句,您的代码很容易理解,但您知道为什么我的代码不起作用吗?
  • 很高兴我能帮上忙。因此 getElementsByTagName 将遍历树,查找标签名称为“client”的任何节点并返回它们。然后,您的代码会返回节点的子节点。客户端的子节点具有标签名称:“code”、“crm”和“company”(因此你只得到那些输出)。您的代码不会深入到树中。我的解决方案将继续在树中搜索更多子节点(子节点的子节点 - 如果有意义的话)。这篇关于 W3C 的教程可以帮助你更好地理解w3schools.com/xml/xml_tree.asp
  • 哦,我明白了,之前的 XML 工作正常,因为节点树没有“子节点的子节点”的节点(如果这有意义 =p)。非常感谢 Ryan,我已经编写了你的​​代码,现在我几乎可以完成我从一开始就计划好的所有事情了。
猜你喜欢
  • 2013-10-22
  • 2023-03-15
  • 1970-01-01
  • 2021-06-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多