msxml selectnodes: пространство имен в текстовом узле - PullRequest
2 голосов
/ 01 марта 2011

Мне нужно следующий XML-файл:

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

Я хочу выбрать все дочерние элементы узла elment, которые имеют элемент Id=text:SOME_ID из узла reference. Я хочу сделать это в C ++ с помощью метода selectNodes объекта IXMLDOMNode из синтаксического анализатора msxml.

В следующем примере у меня выбран узел рефенса в pChild, а для свойства SelectionNamespaces установлено xmlns:n="http://someurl/element":

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

Это не работает. Что я делаю не так?

1 Ответ

1 голос
/ 01 марта 2011

Часть n:link/@ref вашего запроса XPath оценивается в контексте элемента, к которому применяются условные критерии; в этом случае ../../n:element.
Вы не можете ссылаться на общий контекст из условного раздела; другими словами, узел контекста отличается внутри и снаружи [квадратных скобок].

Боюсь, вам придется извлечь pChild->selectSingleNode("n:link/@ref")->text отдельно и вручную вставить его в ваш запрос XPath.

...