XPath中的文档结束

时间:2013-12-21 15:13:39

标签: html xml xpath

当我需要使用XPath检测HTML文档的结尾时,我试图解决this问题并陷入困境。

HTML是:

    <h2>Title 1</h2>
    <br>
    <br>
    <div class="active"></div>
    <h2>Title 2</h2>
    <br>
    <br>
    <div class="active"></div>
    <div></div>
    <div></div>
    <div class="active"></div>
    <h2>Title 3</h2>
    <br>
    <br>
    <div></div>
    <div></div>
    <h2>Title 4</h2>
    <br>
    <br>
    <div></div>
    <div class="active"></div>
    <div></div>

那时我的XPath是

//h2[following-sibling::div[@class='active'][(preceding-sibling::h2 and following-sibling::h2)]]

但它没有检测到'Title 4',因为最后'div'没有'follow-sibling :: h2'。我只能使用XPath检测到文档的末尾。

当'div'介于'h2'和结尾之间时,我需要处理这个案例。

使用'preceding-sibling :: h2 [position()= last()]'没有帮助。

有没有办法使用XPath定义文档的结尾?

2 个答案:

答案 0 :(得分:2)

如果我理解正确,因为您尝试在XPath示例中找到h2,那么您正在寻找未被其他h2跟随的h2。鉴于你给了我们什么,这样就可以了:

//h2[not(following-sibling::h2)]

XPath中的“文档结尾”

XPath文档的结尾是什么? XPath将文档视为节点树。这棵树里的“文件结尾”在哪里?这实际上取决于应用程序。假设我有一个这样的文档:

<foo>
  <p>This is a paragraph</p>
  <p>A second one</p>
</foo>

在我的应用程序中,我希望在“文档末尾”添加一些段落内容的哈希值。在这种情况下,我的意思是“在最后一个结束标签之后”。所以我最终得到这样的东西,最后一行是哈希:

<foo>
  <p>This is a paragraph</p>
  <p>A second one</p>
</foo>
1010DEADBEEF1010

现在生成的文档将不符合XML或HTML,但在我的应用程序中这很好。使用XPath,没有办法说“在最后一个结束标记之后”。我可以做的是告诉XPath获取根节点,然后让其他东西序列化这个节点(这是输出开始和结束标记的过程),并让其他东西添加我的哈希在它之后。 (XPath也可用于选择所有段落来构建哈希)。

不同的情况。我有一个类似上面的文档,但这次我想在“文档末尾”添加版权模糊。我希望结果是格式良好的XML。这次当我说“文档的结尾”时,我指的是“顶级元素的最后一个孩子”之后,最终的结果是:

<foo>
  <p>This is a paragraph</p>
  <p>A second one</p>
  <p>Copyright 2013 Widgets Incorporated</p>
</foo>

这次我可以XPath选择根元素的最后一个子元素,然后使用其他东西来修改文档,以便在最后一个子元素之后添加一个段落。 (XSLT将是我用来执行此操作的工具的一个主要示例,因为XSLT使用XPath来匹配节点。)

我希望我已经证明“文档结尾”是一个特定于应用程序的术语,在XPath使用的数据模型中没有唯一的等价物。

答案 1 :(得分:0)

XPath在树中查找节点。文档的结尾&#39;树中没有节点表示,因此没有任何内容可供查找。