当我需要使用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定义文档的结尾?
答案 0 :(得分:2)
如果我理解正确,因为您尝试在XPath示例中找到h2
,那么您正在寻找未被其他h2
跟随的h2
。鉴于你给了我们什么,这样就可以了:
//h2[not(following-sibling::h2)]
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;树中没有节点表示,因此没有任何内容可供查找。