2012-06-06 66 views
1

我想從xml文件中讀取數據。 我有這樣的代碼:無法從C++中使用MSXML的子節點獲取值

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在每個迭代的情況下返回正確的值,但第二個沒有,事實上它返回第一個子元素,方案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

非常感謝! –