如何使用XPath在省略特定子项的情况下进行选择
本文关键字:情况下 选择 行选 XPath 何使用 | 更新日期: 2023-09-27 18:00:57
我有以下HTML:
<div id="main-body">
<div id="answerswerform">
// ... a few children here i want
<form id=mwanser">
</form>
</div>
</div>
我想要主体中的所有内容,除了表单标签中的内容。。。(也不要表单标签本身(。。。。
我尝试了很多XPath,但都没有成功。
我正在使用C#和HTMLAgilityPack,也许有一种方法可以导航到孩子并将其删除?对我来说,第一个选项也必须是XPath。
我想我已经用这个答案实现了这一点:
如何使用xslt和样式表以及xsltproc从xml中删除元素?
这是使用普通XSL完成的,所以我不知道它是否对HTMLAgilityPack有帮助。
这是我使用的XSL:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="form"/>
</xsl:stylesheet>
编辑:刚刚快速查看了HtmlAgilityPack代码,发现这个应该有效:
HtmlAgilityPack.HtmlNode node;
node = htmldoc.DocumentNode.SelectSingleNode("//form");
node.ParentNode.RemoveChild(node, false);
但由于某种原因,它只删除了开头的标签。
使用XPath,如果您选择一个节点,您将获得该节点及其每个子节点。您可以直接选择子节点,但不选择不需要的节点将您的样本作为测试,您可以写道:
"/*/*/*[not(self::form)]"