2012-06-06 1 views
1

Я хочу прочитать из XML-файла. У меня есть этот код:Не удается получить значение из дочернего узла с MSXML в C++

IXMLDOMDocument *pXMLDom=NULL; 
IXMLDOMNodeList *pXMLDomNodeList=NULL; 
VARIANT varFileName; 
VARIANT_BOOL varStatus; 
BSTR bstrNodeValueParent = NULL; 
BSTR bstrNodeValueChild = NULL; 

CreateAndInitDOM(&pXMLDom); 
VariantFromString(L"file.xml", varFileName); 
pXMLDom->load(varFileName, &varStatus) 
if (varStatus == VARIANT_TRUE){ 

     long lengthNodeList; 
     BSTR bstrQueryTemp=SysAllocString(L"//parent_tag"); 
     pXMLDom->selectNodes(bstrQueryTemp,&pXMLDomNodeList); 
     pXMLDomNodeList->get_length(&lengthNodeList); 
     for(int j=0; j < lengthNodeList; j++){ 
      IXMLDOMNode *pNodeParent = NULL; 
      IXMLDOMNode *pNodeChild = NULL; 
      BSTR bstrNodeValueChild; 

      pXMLDomNodeList->get_item(j, &pNodeParent);  
      pNodeParent->get_xml(&bstrNodeValueParent); 
      printf("\n Parent Node: %S",bstrNodeValueParent); 

      pNodeParent->selectSingleNode(L"//child1_tag",&pNodeChild); 
      pNodeChild->get_xml(&bstrNodeValueChild); 
      printf("\n Child Node: %S",bstrNodeValueChild); 

      SysFreeString(bstrNodeValueParent); 
      SysFreeString(bstrNodeValueChild); 
      SAFE_RELEASE(pNodeParent); 
      SAFE_RELEASE(pNodeChild); 
     } 
} 

Первый Printf возвращает правильное значение в каждом случае итерации, но второй нет, Infact она возвращает значение первого дочернего элемента, случай J == 0. Зачем?

file.xml пример:

<?xml version="1.0"?> 
<!--xml file created using XML DOM object.--> 
<root created="using dom"> 
    <parent_tag> 
     <child1_tag>Child1-1</child1_tag> 
     <child2>Child1-2</child2> 
    </parent_tag> 
    <parent_tag> 
     <child1_tag>Child2-1</child1_tag> 
     <child2>Child2-2</child2> 
    </parent_tag> 
    <parent_tag> 
     <child1_tag>Child3-1</child1_tag> 
     <child2>Child3-2</child2> 
    </parent_tag> 
</root> 
+0

Можно ли увидеть файл? –

ответ

0

Из XPath specs (курсив):

//para выбирает все para потомков корня документа и, таким образом, выбирает всеpara элементов в том же документе, что и контекстный узел.

Вы проходя "//child1_tag" к selectSingleNode() в цикле, но это выражение всегда будет соответствовать первому child1_tag элемент в документе, а не в текущем родителю.

Попробуйте вместо этого:

pNodeParent->selectSingleNode(L"child1_tag", &pNodeChild); 
+0

Большое спасибо! –