代码之家  ›  专栏  ›  技术社区  ›  Robert C. Barth

如何确定HTML块是否不包含任何文本节点

  •  0
  • Robert C. Barth  · 技术社区  · 16 年前

    你/有没有办法找出一个HTML块是否包含零文本节点?

    例如:

    <p><div><span></span></div></p>
    

    包含零个文本节点,而此节点:

    <p>Stuff</p><div><span>other stuff</span></div>
    

    包含两个。

    另外,您可以保证HTML是XHTML兼容的,并且内容的大小可能小于4K。我使用的是.NET,所以如果有服务器端的建议,请使用C。我想我可以将它加载到一个xmldocument中,并遍历dom树来查找非空的xmltext节点,但这将是最后一个解决办法,因为速度是最重要的问题。

    4 回复  |  直到 16 年前
        1
  •  1
  •   peter.murray.rust    16 年前

    我会按照您的建议做-查找非空的xmltext节点。记住,XML没有一致的词汇形式(例如引用、空白、CDATA都会导致问题)。在您尝试之前,您是否知道使用DOM会影响性能?

    更新 您不必使用xmldocument(或xdocument)。有许多工具可以解决这个问题。我会看像斯塔克斯这样的东西 http://en.wikipedia.org/wiki/StAX -流式XML解析器-在这里,您可以很快找到一个非空的文本节点。XML社区在优化性能方面投入了大量工作。你可能会发现那个萨克森( http://saxon.sourceforge.net/ 或LIbxML2( http://xmlsoft.org/ )有你需要的。”用libxml2编程就像一个异域陌生人的激动人心的拥抱。

    在任何情况下,如果您在XML-DEV上问您的问题( http://www.xml.org/xml-dev/ -如果你没有得到明确而有用的建议,我会很失望的。

        2
  •  1
  •   David Hedlund    16 年前

    给定一个特定的HTML块,您可以随时删除其中的所有内容 < , > ,以及所有空白,并查看剩余字符串是否为空。这种方法可以在任何处理正则表达式的语言中使用,但在javascript中有一个例子:

    var isEmpty = someNode.innerHTML.replace(/<[^>]+>/g, "").replace(/\s/g, "") == ""
    
        3
  •  0
  •   LorenVS    16 年前

    如果我没有弄错,您应该能够使用InnerText属性(在Internet Explorer中,在其他浏览器中有一个等价的属性,我记不起名称),并将其与空字符串进行比较。

    再想一想,这个属性可能会去掉空白,但它值得一试。

        4
  •  0
  •   Alohci    16 年前

    这就是为什么不使用正则表达式。

    以下HTML通过了HTML 4.01验证。

    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
       "http://www.w3.org/TR/html4/loose.dtd">
    <title>demo</title>
    <div><p class=">" ></div>
    

    如果somenode是div,d的regex将失败。如果regex甚至不能处理简单有效的HTML,那么它使用无效标记的可能性有多大?