2011-03-01 64 views
2

我有下面的XML文件:MSXML的selectNodes:命名空間中的文本節點

<root xmlns="http://someurl/element" xmlns:text="http://someurl/text"> 
    <elements> 
    <element> 
     <Id>text:SOME_ID</Id> 
     <!-- some other elements --> 
    </element> 
    <element> 
     <!-- some other elements --> 
     <reference> 
      <link ref="text:SOME_ID" /> 
     </refernce> 
    </element> 
    </elements> 
</root> 

我要選擇具有不同於reference節點的元素Id=text:SOME_IDelment節點的所有子元素。我想通過使用msxml解析器中的IXMLDOMNode對象的selectNodes方法在C++中執行此操作。

在下面〔實施例我在pChild選擇refence節點和​​propetey設置爲xmlns:n="http://someurl/element"

MSXML2::IXMLDOMNodePtr pSelectedNodes = 
    pChild->selectNodes("../../n:element[n:Id=n:link/@ref]/n:*"); 
__ASSERT(pSelectedNodes->length > 0) 

這是行不通的。我究竟做錯了什麼?

+0

@ user141478:問題是您需要在內部上下文過濾器中使用外部上下文。這在XPath 1.0中不可行。在XPath 2.0中,你可以這樣做:'爲$ current。返回/ */*/n:元素[n:Id eq $ current/@ ref]' – 2011-03-01 16:42:28

回答

1

您的XPath查詢的n:link/@ref部分是在應用條件標準的元素的上下文中評估的;在這種情況下是../../n:element
您不能在條件部分中引用整體上下文;換句話說,上下文節點在[方括號]內部和外部是不同的。

恐怕您必須單獨提取pChild->selectSingleNode("n:link/@ref")->text,然後將其手動插入到您的XPath查詢中。

相關問題