3

我通过 AJAX 调用接收 XML 数据。其中一个标签包含大量文本,大约 4000-5000 个字符。在 Firefox 中,该字段在第 3000 个字符左右被截断。我在网上找到的大多数东西都说节点值大小没有限制,但有时它取决于实现 - 没有可靠的答案。

假设对 nodeValue 的大小没有限制,是否有人对为什么会发生这种情况有任何建议?如果是这样,有什么解决方法吗?

<test>
  <foo>very long string...</foo>
</test>

value = testTag.getElementsByTagName("foo").item(0).firstChild.nodeValue;

值被截断。

- 如果我打印 xmlHttp.responseText,则打印所有数据。

4

4 回答 4

4

检查这个。它说:

“另外需要注意的是,尽管规范说无论标签之间存在多少文本,都应该在一个文本节点中,但实际上并非总是如此。在 Opera 7-9.2x 和 Mozilla/Netscape 6 +,如果文本大于特定的最大大小,则将其拆分为多个文本节点。这些文本节点将在父元素的 childNodes 集合中彼此相邻。

于 2010-12-10T17:23:00.703 回答
1

@Kooilnc 说得对,Firefox 中的文本节点限制为 4k。

您可以通过以下方式解决它:

function getNodeText(xmlNode) {
    if(!xmlNode) return '';
    if(typeof(xmlNode.textContent) != "undefined") return xmlNode.textContent;
    return xmlNode.firstChild.nodeValue;
}

text = getNodeText(document.getElementsByTagName("div").item(0));
alert(text.length);

在此处查看实际操作:http: //jsfiddle.net/Bkemk/2/

从这里借用的函数: http ://www.quirksmode.org/dom/tests/textnodesize.html

于 2010-12-10T18:39:59.443 回答
0

我想出的不是针对单个节点:

function getDataOfImmediateChild(parentTag, subTagName)
{
    var val = "";
    var listOfChildTextNodes;
    var directChildren = parentTag.childNodes;

    for (m=0; m < directChildren.length; m++)
    {
        if (directChildren[m].nodeName == subTagName)
        {
           /* Found the tag, extract its text value */
           listOfChildTextNodes = directChildren[m].childNodes;
           for (n=0; n < listOfChildTextNodes.length; n++)
           {
              if (typeof listOfChildTextNodes[n] == "TextNode")
                val += listOfChildTextNodes[n].nodeValue;
           }
         }
    }
    return val;

确保 listOfChildTextNodes[n] 元素是一个 TextNode 可能也是值得的。

于 2010-12-10T18:51:03.887 回答
0

@Ryley

我对直接子级进行迭代的唯一原因是因为 getElementsByTagName 和 getElementsById 将返回层次结构更远的节点。更好地解释为一个例子:

<foo>
  <bar>
    <zoo>
       <bar>-</bar>
    </zoo>     
   <bar></bar>
</zoo>

如果我说 fooTag.getElementsByTagName("bar"),它将返回一个包含两个 s 的数组,即使我只想要第二个(因为它是 的唯一真正的孩子)。我能想到强制执行这种“仅搜索我的直接孩子”的唯一方法是遍历孩子。

于 2010-12-10T20:03:26.743 回答