选择XHTML中的所有格式化节点

选择XHTML中的所有格式化节点,html,xpath,html-agility-pack,Html,Xpath,Html Agility Pack,使用HTML Agility Pack,我尝试使用XPATH在XHTML中选择节点。 我想选择下面每个p标签中列出的孩子,但不选择孙子: <strike></strike> <em></em> <u></u> <strong></strong> <sub></sub> <sup></sup> 换句话说,我要找的是A和B,但不是这两个节点的第二级。同时,

使用HTML Agility Pack,我尝试使用XPATH在XHTML中选择节点。 我想选择下面每个p标签中列出的孩子,但不选择孙子:

<strike></strike>
<em></em>
<u></u>
<strong></strong>
<sub></sub>
<sup></sup>
换句话说,我要找的是A和B,但不是这两个节点的第二级。同时,A或B节点可以在集合中的任何位置找到。注意:A或B可以是我上面列出的任何一个

如果我有以下XHTML:

<?xml version='1.0' encoding='utf-8'?>
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta name="generator" content="HTML Tidy for Windows (vers 25 March 2009), see www.w3.org" />
<title></title>
</head>
<body>
    <p><strike>element 1</strike> and <strike><em>element 2</em></strike></p>
    <p><strike>element 3</strike></p>
    <p><strike>element 4</strike></p>
</body>
</html>
如果我可以选择上面在每个p标记中列出的子节点,它将返回以下节点集合:strike、strike、strike和strike。让我接触每次罢工的孩子

<strike>element 1</strike> and <strike><em>element 2</em></strike>
XPATH中的第一个表示sub[1],我指的是strike的实例,第二个被忽略的是sub[2],我指的是strike的实例。这很有意义,因为我的查询就是这样做的。然后XPATH抓取标记,以此类推

另一种解释方法是说我想要//a |//b |//c |//d |//e而不是孩子们。这可能吗

最后,这让我对如何找到解决方案感到困惑

我在寻找关于XPATH的答案

如果您需要进一步的研究或信息,请告诉我。我会提供的。

您使用//

这将选择整个文档中的所有匹配节点,无论处于哪个级别。如果仅当某些节点位于p的正下方时才选择它们,请执行//p/strike。这将在任何地方匹配一个p节点,但只会直接在p下攻击节点。

根据Frank van Puffelen和一位同事的建议,我想出了一个很好的解决方案

这个问题将分两步解决

首先,我将选择所有需要的节点SelectNodes//strike |//em |//u |//strong |//sub |//sup

其次,我将使用for循环遍历我选择的所有节点,查看父节点,如果父节点是以下节点之一:strike、em、u、strong、sub和sup,然后删除它并继续


谢谢大家。

对不起,这不是我想要的。我相信我的例子建议使用//和p。为什么不呢?你有没有办法把你的问题简化为你的问题的简单再现?是的,但需要寻找每种类型的标签。例如,如果我使用//p/strike,则需要查找//td/p/strike、//li/p/strike等。我不想支持更多的标记,但如果没有其他方法,我已经考虑过了。我担心无法捕获其他可能丢失的标记。如果您想捕获所有标记,可以匹配//*。但是,你最初的问题中只有一个层次的深层逻辑是没有意义的。从问题中去掉所有你尝试过的东西,只留下:XML,你能想到的最好的XPath,以及它不匹配的节点。事实上,我想我可以使用//p,因为它是根,我可以得到每个的子节点,然后从那里开始。这也将针对表。谢谢你的主意。