Как выбрать, исключив конкретного ребенка с помощью XPath? - PullRequest
1 голос
/ 01 июля 2011

У меня есть следующий HTML:

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

Я хочу все в основном теле, кроме того, что находится в теге формы ... (и сам тег формы тоже не хочу)....

Я много пробовал с XPath, но у меня ничего не получилось.

Я работаю с C # и HTMLAgilityPack, возможно, есть способ перейти к ребенку и вместо этого удалить его?Первый вариант для меня тоже должен быть XPath.

Ответы [ 2 ]

1 голос
/ 01 июля 2011

Я думаю, что достиг этого, используя этот ответ:

Как удалить элементы из xml, используя xslt с таблицей стилей и 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);

но по какой-то причине он удалил только открывающий тег.

0 голосов
/ 01 июля 2011

С XPath, если вы выбираете узел, вы получаете узел и каждого потомка в нем.Что вы можете сделать, это выбрать дочерние элементы напрямую, но нежелательный узел. Взяв ваш образец в качестве теста , вы можете написать:

"/*/*/*[not(self::form)]"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...