c++ - 无法在 C++ 中使用 MSXML 从子节点获取值

标签 c++ msxml

我想从 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 the para descendants of the document root and thus selects all para 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/

相关文章:

c++ - 行进立方体问题

c++ - 在机器字大小等于32位的计算机上,int64_t如何工作?

c++ - 有没有办法查询消息过滤器是否已经生效?

C++ "' DOMDocument' : redefinition"Error with Xercesc

ms-access - 使用 VBA 解析 XML 文件

c++ - 如何从 IXMLDOMNode 访问元素属性?

c++ - 我=我++;未定义。 i = foo(i++) 是否也未定义?

c++ - char* 数组的问题

inno-setup - 如何在 Inno Setup 中检查是否安装了 MSXML 4.0?

excel - XMLHTTP onTimeOut 时如何使用 VBA 回调函数?