我想从 xml 文件中读取。 我有这段代码:
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。为什么?
文件.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>
最佳答案
来自XPath specs (强调我的):
//para
selects all thepara
descendants of the document root and thus selects allpara
elements in the same document as the context node.
您在循环中将 "//child1_tag"
传递给 selectSingleNode()
,但此表达式将始终匹配第一个 child1_tag
文档中的元素,而不是当前父元素中的元素。
改为尝试:
pNodeParent->selectSingleNode(L"child1_tag", &pNodeChild);
关于c++ - 无法在 C++ 中使用 MSXML 从子节点获取值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10914195/