XML解析之 MSXML应用总结 开发篇(下)

三、查询XML文档节点

   这部分属于“读”XML文档并做节点遍历,由于担心加上实例会占用过多的篇幅影响阅读,先在这篇做方法总结,以后有时间再写一篇“实战篇”专门写个实例工程,可以有更完整的参考代码。

   查询和遍历XML文档的大致步骤:创建IXMLDOMDocument接口对象 -> load加载文档 -> 得到root节点 -> 依次遍历各节点。也可以通过IXMLDOMDocument接口的selectSingleNode或selectNodes函数分别得到指定节点或节点集合

1、查询文档中指定节点

    MSXML2::IXMLDOMNodePtr pNode = pXmlDoc->selectSingleNode(L"root/record");

   if( pRootNode == NULL)

   {

        // fail process

   }

   selectSingleNode函数允许用类似路径的XPath方式查询节点,返回第一个符合的节点。

 

2、查询节点集合

 

    MSXML2::IXMLDOMNodeListPtr pNodeList = pXmlDoc->selectNodes(L"root/record ");

   if( pNodeList == NULL)

   {

        // fail process

   }

 

   与上面方法不同的是,selectNodes函数返回的是一个节点接口指针列表。需要说明的是,这两个函数是IXMLDOMNode接口的函数,因此可以从任一节点进行这样的查询,使用相对调用节点的相对路径即可。如果通过节点的标签名来查询,也可以使用getElementsByTagName函数,该函数不如selectNodes功能丰富,但使用起来比较简单。在IXMLDOMNode和IXMLDOMElement接口中均实现了该函数。

     

MSXML2::IXMLDOMNodeListPtr pNodeList = pXmlDoc->getElementsByTagName_r("tag name");

    if( pNodeList == NULL)

    {

        // fail process

    }

    int nCount = pNodeList->Getlength();

    pNodeList->reset();

    for( int i=0; i<nCount; i++)

    {

        MSXML2::IXMLDOMNodePtr pNode = pNodeList->Getitem(i);

        if(pNode)

        {

             // node process

        }

    }

 

3、查询节点属性

   查询IXMLDOMElement接口节点的某个属性值:

   

 _variant_t varValue = pRootNode->getAttribute("attirbute name");

    if( varValue.vt != VT_NULL)

    printf("%s", _bstr_t(varValue));

 

   或者可以先得到IXMLDOMAttribtute接口,通过接口函数查询属性值:

    MSXML2::IXMLDOMAttributePtr pAttriNode = pRootNode->getAttributeNode("attirbute name");

    if( pAttriNode)

    {

        _variant_t varValue;

        HRESULT hr = pAttriNode->get_nodeval_rue(&varValue);

        if( SUCCEEDED(hr))

        {  

           printf("%s", _bstr_t(varValue));

        }   

} 

 

   IXMLDOMNode接口类中有attributes成员变量,可以直接拿到节点属性的集合,再通过IXMLDOMNamedNodeMap接口查询属性值:

 

    MSXML2::IXMLDOMNamedNodeMapPtr pAttrs = pRootNode->Getattributes();

    if( pAttrs) {

        MSXML2::IXMLDOMNodePtr pNode = pAttrs->getNamedItem("attirbute name");

        if( pNode) {

             _variant_t varValue;

             HRESULT hr = pNode->get_nodeval_rue(&varValue);

             if( SUCCEEDED(hr))

                  printf("%s", _bstr_t(varValue));

        }

   }

 

   也可以通过IXMLDOMNamedNodeMap的元素遍历来查询。

 

4、查询节点内容

   从IXMLDOMNode继承的接口都可以直接查询节点内容:

 

    _bstr_t bstrText = pNode->Gettext();

   printf("%s", bstrText);

 

   若节点类型是CDATA SECTION,则Gettext函数返回的是CDATA的文本内容;若为Comment类型则返回注释内容。

 

5、查询节点名称

   对于元素类型节点或者属性节点,有时需要查询其标签名或者属性名,可以用IXMLDOMNode接口函数:

 

    _bstr_t bstrName = pNode->GetnodeName();

   printf("%s", bstrName);

 

   注意GetnodeName函数对于不同类型的节点得到的名称种类是不同的,具体可参考MSDN。

 

四、创建或修改XML文档节点

   这部分属于“写”XML文档,大致的步骤是:创建IXMLDOMDocument接口对象 -> 创建root节点并添加到document上 -> 依次创建所需类型的节点并添加到父节点。对于修改已有XML文档节点,只需要按照上面查询节点的方法找到该节点,用get相对应的put函数修改即可。下面主要介绍一下创建的详细过程。

 

1、创建节点

   下面是document添加root节点的代码:

 

   MSXML2::IXMLDOMElementPtr pRootNode = pXmlDoc->createElement_x("root");

   pXmlDoc->appendChild(pRootNode);

 

    一般情况下,创建节点的步骤都是由IXMLDOMDocument接口对象create一个类型节点出来,然后由父节点接口对象调用appendChild函数将创建节点添加上去。总结一下创建各类型节点接口的方法:

      IXMLDOMAttribute             :createAttribute

      IXMLDOMCDATASection          :createCDATASection

      IXMLDOMComment               :createComment

      IXMLDOMDocumentFragment     :createDocumentFragment

      IXMLDOMElement               :createElement_x

      IXMLDOMEntityReference       :createEntityReference

      IXMLDOMProcessingInstruction :createProcessingInstruction

      IXMLDOMText                  :createTextNode

   另外还有一个createNode函数可以创建指定类型的节点。

 

2、设置创建节点各种类型值

   下面是设置一个节点的内容代码:

 

    MSXML2::IXMLDOMNodePtr pNode = pXmlDoc->createElement_x("title");

    if( pNode)

    {

        pNode->Puttext("title text");

        pRootNode->appendChild(pNode);

   }

 

    只需要调用各类型接口对应的put函数进行设置就可以了。

 

3、设置创建节点的属性

   两种方法,一种是先添加IXMLDOMElement类型节点再设置属性:

    

 _variant_t varLanguage = "chinese";

    HRESULT hr = pRootNode->setAttribute("language", varLanguage);

   ASSERT(SUCCEEDED(hr));

 

   另一种是直接添加IXMLDOMAttribute类型节点:

 

    MSXML2::IXMLDOMAttributePtr pAttribute = pXmlDoc->createAttribute("language");

    if(pAttribute)

    {

        _variant_t varLanguage = "chinese";

        pAttribute->Putvalue(varLanguage);

        pRootNode->setAttributeNode(pAttribute);

   }

 

4、插入节点

   插入节点可以用insertBefore函数,代码如下:

    

 MSXML2::IXMLDOMElementPtr pNewElement = pXmlDoc->createElement_x("date");

    if( pNewElement)

    {

        HRESULT hr = pRootNode->insertBefore(pNewElement, (_variant_t)pRootNode->GetchildNodes()->Getitem(1));

        ASSERT(SUCCEEDED(hr));

   }

 

   对于不同类型的节点,此函数要求插入的节点类型和返回值类型都有比较复杂的规范,具体可以参考MSDN,在此不详细介绍了。

 

5、  删除节点

   对于不同类型的节点接口,有不同的remove函数可以删除节点,总结如下:

   IXMLDOMElement : removeAttribute,removeAtrributeNode

   IXMLDOMNamedNodeMap : removeNamedItem

    IXMLDOMAttributeIXMLDOMCommentIXMLDOMDocumentIXMLDOMDocumentFragmentIXMLDOMElementIXMLDOMNodeIXMLDOMText  : removeChild

 

    示例代码:

     

MSXML2::IXMLDOMElementPtr pRootNode = pXmlDoc->documentElement;

    pRootNode->removeAttribute("languge");

 

   这篇就总结这些,希望对大家有所帮助;如果有写的不对之处,请不吝赐教。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值