2011-07-01 49 views
1

我有以下HTML:如何使用XPath忽略特定的孩子進行選擇?

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

我想在主體一切,除了是什麼形式的標籤......(並且不希望表單標籤自己太)....

我用XPath嘗試了很多,但是我沒有成功。

我正在使用C#和HTMLAgilityPack,也許有一種方法來導航到孩子並刪除它呢?我的第一個選擇也必須是XPath。

回答

0

使用XPath,如果您選擇一個節點,您獲得節點及其中的每個後代。你可以做的是直接選擇兒童,但不需要的節點。 以你的樣品測試,你可以寫:

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

如果我還需要選擇主體呢?不可能? 如果我的預期結果是:

// ... a few children here i want

+0

您正在嘗試轉換節點。這在XPath中無法實現(肯定在1.0中)。使用XSLT,或者選擇想要的節點並以編程方式修改它。 –

+0

那麼,如果我選擇沒有兩個環境div的HTML,假設這裏的孩子是一個表格,例如,如果我嘗試重新創建html文檔後,div無關緊要? –

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); 

,但由於某種原因,它只是刪除了開標籤。

+0

是的,我知道使用XSL會更容易,但不幸的是我不能在我的環境中使用它。不管怎麼說,還是要謝謝你! –

+0

很高興我能提供一些幫助。我剛剛通過我嘗試過的簡短測試進行了快速編輯。 – Kioshiki