2009-04-24 89 views
39

如何使用XPath訪問XML文檔中的註釋?使用XPath訪問XML中的註釋

例如:

<table> 
<length> 12 </length> 
<!--Some comment here--> 
</table> 

我想 「這裏有些評論」 訪問。

謝謝...

編輯:我使用MSXML DOM ActiveX和命令評論()似乎是失敗......任何想法,爲什麼?

回答

50

隨着路徑

/foo/bar/comment() 

您可以選擇在/富/酒吧元素的所有意見。當然,可能取決於你選擇的語言。但通常這是你如何做到的。例如

+0

我正在使用MSXML DOM ActiveX,並且此命令似乎失敗了......任何想法爲什麼? – Manoj 2009-04-24 07:11:02

+0

不,我不知道爲什麼。從上次使用MSXML庫開始已經過去7年了... – 2009-04-24 07:28:26

+0

確定您的xpath根目錄是否正常?嘗試「//評論()」以確保。 – annakata 2009-04-24 07:56:48

19

使用註釋()函數: -

/table/length/following::comment()[1] 

選擇下面的長度元件的第一評論。

編輯

馬諾在問這個答案爲什麼這不是在MSXML工作的評論。原因將是你使用的是MSXML3。默認情況下,MSXML3不使用XPath作爲其選擇語言,它默認使用較早的較弱語言(XSL模式)。您需要通過DOMDocument的setProperty方法將XPath設置爲選擇語言。 E.g(在JScript): -

var dom = new ActiveXObject("MSXML2.DOMDocument.3.0"); 
dom.setProperty("SelectionLanguage", "XPath"); 

現在全XPath語言會在你的查詢工作(注意一個重大更改是索引謂詞是基於XPath中1,而他們基於XSL模式爲0)。

1

也許這coud幫助, 此示例刪除評論

XmlNodeList list = xmlDoc.SelectNodes("//comment()"); 
foreach(XmlNode node in list) 
node.ParentNode.RemoveChild(node); 

從這裏link text

3

基於業務方案的意見,發佈答案(和我的好奇,爲什麼這個簡單的東西是行不通的湊近),這裏是我的建議:

使用@Anthony建議的XPath表達式,我能夠使用以下JS函數成功加載註釋節點:

function SelectComment(s) 
{ 
    var xDoc = new ActiveXObject("MSXML2.DOMDocument.6.0"); 
    if (xDoc) 
    { 
    xDoc.loadXML(s); 
    var selNode = xDoc.selectSingleNode("/table/length/following::comment()[1]"); 
    if (selNode != null) 
     return selNode.text; 
    else 
     return ""; 
    } 
} 

樣品調用:

SelectComment("<table><length> 12</length><!--Some comment here--></table>"); 

輸出:

"Some comment here" 

注:

一個。您的MSXML版本可能會有所不同。請適當使用。

b。絕對不推薦這種代碼,因爲它只適用於IE。但是,由於這是你明確聲明的要求,所以我使用了ActiveXObject。

c。您在評論中沒有提到在建議的XPath表達式中失敗的內容。我的猜測是,您不查詢檢索節點的text屬性。請記住,SelectSingleNode始終返回IXmlNode,您需要查詢其datatext屬性。