C++ Can';t使用C+;中的MSXML从子节点获取值+;

C++ Can';t使用C+;中的MSXML从子节点获取值+;,c++,msxml,C++,Msxml,我想从xml文件中读取。 我有以下代码: IXMLDOMDocument *pXMLDom=NULL; IXMLDOMNodeList *pXMLDomNodeList=NULL; VARIANT varFileName; VARIANT_BOOL varStatus; BSTR bstrNodeValueParent = NULL; BSTR bstrNodeValueChild = NULL; CreateAndInitDOM(&pXMLDom); VariantFromStrin

我想从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);
        }
}
IXMLDOMDocument*pXMLDom=NULL;
IXMLDOMNodeList*pXMLDomNodeList=NULL;
变量变量文件名;
变体_BOOL varStatus;
BSTR bstrNodeValueParent=NULL;
BSTR bstrNodeValueChild=NULL;
createandinitom(&pXMLDom);
VariantFromString(L“file.xml”,varFileName);
pXMLDom->load(varFileName和varStatus)
if(varStatus==变量_TRUE){
长长度节点器;
BSTR bstrQueryTemp=SysAllocString(L”//parent_标记);
pXMLDom->selectNodes(bstrQueryTemp和pXMLDomNodeList);
pXMLDomNodeList->get_length(&lengthNodeList);
对于(int j=0;jget_项(j和pNodeParent);
pNodeParent->get_xml(&bstrNodeValueParent);
printf(“\n父节点:%S”,bstrNodeValueParent);
pNodeParent->selectSingleNode(L”//child1_标记“,&pNodeChild);
pNodeChild->get_xml(&bstrNodeValueChild);
printf(“\n子节点:%S”,bstrNodeValueChild);
SysFreeString(bstrNodeValueParent);
SysFreeString(bstrNodeValueChild);
安全释放(pNodeParent);
安全释放(pNodeChild);
}
}
第一个printf在每个迭代案例中返回正确的值,但第二个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>

儿童1-1
儿童1-2
儿童2-1
儿童2-2
儿童3-1
儿童3-2
来自(强调矿):

//para
选择文档根的所有
para
子体,从而 选择与上下文节点位于同一文档中的所有
para
元素

您正在将
“//child1_标记”
传递给循环中的
selectSingleNode()
,但此表达式将始终与文档中的第一个
child1_标记
元素相匹配,而不是当前父元素中的元素相匹配

请尝试:

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

有可能看到这个文件吗?