【问题标题】:How to select with omitting a specific child using XPath?如何使用 XPath 省略特定子项进行选择?
【发布时间】:2011-07-01 20:53:04
【问题描述】:

我有以下 HTML:

<div id="main-body">
    <div id="answerform">
        //  ... a few children here i want
        <form id=mwanser">
        </form>
    </div>
</div>

我想要主体中的所有内容,除了表单标签中的内容......(并且也不想要表单标签本身)......

我用 XPath 尝试了很多,但我没有成功。

我正在使用 C# 和 HTMLAgilityPack,也许有一种方法可以导航到孩子并删除它?我的第一个选项也必须是 XPath。

【问题讨论】:

    标签: c# .net html xpath


    【解决方案1】:

    我想我已经使用这个答案实现了这一点:

    How to remove elements from xml using xslt with stylesheet and xsltproc?

    这是使用普通 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);
    

    但由于某种原因,它只删除了开始标签。

    【讨论】:

    • 是的,我知道使用 XSL 会更容易,但不幸的是我不能在我的上下文中使用它。还是谢谢!
    • 很高兴我能提供一点帮助。我刚刚通过一个简短的测试进行了快速编辑。
    【解决方案2】:

    使用 XPath,如果您选择一个节点,您将获得该节点及其中的每个后代。您可以做的是直接选择子节点,而不是不需要的节点。 以你的样本作为测试,你可以这样写:

    "/*/*/*[not(self::form)]"
    

    【讨论】:

    • 如果我也需要选择主体怎么办?不可能的?如果我的预期结果是:
      // ... 我想要几个孩子
    • 您正在尝试转换您的节点。这在 XPath 中无法实现(肯定在 1.0 中)。使用 XSLT,或选择所需节点并以编程方式对其进行修改。
    • 好吧,如果我选择没有两个周围 div 的 html,假设这里的孩子是一个表格,例如,如果我尝试重新创建 html doc,那么 div 真的没关系吗?
    • 是的,你可以得到孩子并用他们来构建你的最终html。
    猜你喜欢
    • 2010-10-27
    • 2021-05-08
    • 1970-01-01
    • 2017-04-29
    • 1970-01-01
    • 1970-01-01
    • 2013-06-18
    • 2013-08-18
    • 1970-01-01
    相关资源
    最近更新 更多