【问题标题】:testing to see if you have empty text node in xml测试以查看 xml 中是否有空文本节点
【发布时间】:2013-06-22 22:05:40
【问题描述】:

使用 Ajax 获取 XML 数据。关于空白文本节点的问题

我在这里阅读了这个问题/答案 Javascript/XML - Getting the node name

这帮助我了解了很多关于结构是如何设置的但是我仍然有一两个问题......当他提到这部分时:

“带有回车和一些空格或制表符的文本节点”

您将如何测试以查看是否获得了这样的空文本节点?我试过测试看看:

if nodeValue == null
nodeValue == "null"
nodeValue == ""
nodeValue == " "

这些似乎都不起作用

我认为长度可能是 0,所以我测试了 .length,它返回 5(1 个返回键和 4 个标签。在其中添加了一个额外的标签并再次测试它返回 6)

然后我用谷歌搜索了如何删除空格并使用了这些:

.replace(/\s+/g, ' ');
.replace(/^\s+|\s+$/g, '');

都没有工作,仍然说 .length 仍然是 5

我想对此进行测试的原因是,如果我事先不知道每个元素节点名称或不知道 DOM 的确切设置方式。

或者有没有更好的导航方式而无需检查文本节点是否只是制表符/空格/返回键?

【问题讨论】:

  • if (!nodeValue.trim().length) 应该足够了
  • @Xotic750:直到最近才在String.prototype 上没有trim,所以依赖它可能会有问题。 IE8有吗? (我手边没有测试机……)
  • if ( ! nodeValue.replace(/(\r\n|\n|\r|\s|\t)/gm,"").length )
  • 有许多不同的trim shims 可用于不支持它的旧浏览器,MDN 有一个或es5_shim @T.J.克劳德 IE9+

标签: javascript xml dom


【解决方案1】:

.replace(/^\s+|\s+$/g, ''); 有效,除非空格/制表符不是真正的空格和制表符,而是各种其他 Unicode 类似空格的字符之一。所以我猜你没有正确使用它。

这将是如何使用它:

if (!textNode.nodeValue.replace(/^\s+|\s+$/g, '')) {
    // Node is empty
}

示例:Live Copy | Live Source

var xml = parseXml("<test>\n\t\t\t</test>");
var textNode = xml.documentElement.firstChild;
display("textNode.nodeValue.length = " +
        textNode.nodeValue.length);
display('Is "empty"? ' +
        (!textNode.nodeValue.replace(/^\s+|\s+$/g, '')));

function display(msg) {
  var p = document.createElement('p');
  p.innerHTML = String(msg);
  document.body.appendChild(p);
}

输出:

textNode.nodeValue.length = 4
是空的”?真的

(其中parseXMLfrom this answer。)


但是我们真的不需要replace(尽管这样做的开销是微不足道的)。像这样的测试可以做到:

if (/^\s*$/.test(textNode.nodeValue)) {
    // The node is "empty"
}

该正则表达式(零个或多个空格字符,两端带有锚点)将仅匹配已经为空或仅包含空格字符的字符串。

【讨论】:

  • @TJ 谢谢。我用错了。我像你一样做了它然后改变它以尝试在我的代码中..两次都有效。我在哪里可以找到函数中所有不同字符的含义? s 和 g 等
  • @Solus:不用担心,很高兴有帮助。 :-)
  • 确实如此。这比最终解决方案更有意义。当您更新时,我将删除它(因此它不用作解决方案):) +1
猜你喜欢
  • 2012-06-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多