【转】msxml 操作xml

转自http://blog.csdn.net/dai_jing/article/details/8393392,原始出处不详。

1.简介

在.NET平台,微软为C#或托管C++程序员提供了丰富的类库,用以支持各种需求,其中就有对XML文件操作的丰富的类。例如XMLDocument, XmlElement等。但是C++标准库中并未提供相应的库。本地开发的C++程序员一般采用开源类库实现对XML文件的操作,例如比较优秀的TinyXML。TinyXML是开源且可以任意免费使用的类库,可以免费用于商业软件中,因此使用者很多。但是在项目中维护第三方类库有时比较麻烦,因此一些开发人员希望避免使用第三方的工具。微软提供的MSXML可以实现对XML文档的相关操作。

2.MSXML 和 DOM

MSXML全称是Microsoft XML Core Service。MSXML提供的核心功能之一是解析XML文件,并创建DOM树,用户可以通过接口方便的访问DOM树的内容,而不用自己进行内存的维护。如下图所示:

MSXML是以COM技术提供相关服务,通过CLSID或ProgID创建MSXML对象,因此使用MSXML需要基本的COM知识基础。MSXML有多个版本,最新版是6.0,本文主要使用3.0版本,介绍基本的使用情况。

3.常用接口

IXMLDOMDocument 代表了XML的整个文档。

IXMLDOMNode各类节点接口的父类。

IXMLDOMElement代表一个元素对象。继承自IXMLDOMNode

IXMLDOMAttribute代表一个IXMLDOMElement节点的属性对象,继承自IXMLDOMNode

4. 示例

#include "stdafx.h"
#include<iostream>
#include<objbase.h>
#include<msxml2.h>
#include<comutil.h>  

#import "msxml3.dll"
using namespace std;  

int _tmain(int argc, _TCHAR* argv[])
{
    //首先初始化COM
    HRESULT hr;
    hr = CoInitialize(NULL);
    if( hr != S_OK )
    {
        cout<<"Initialize COM error."<<endl;
        return 0;
    }
    //创建Document对象
    MSXML2::IXMLDOMDocumentPtr pDoc;
    hr = pDoc.CreateInstance("Msxml2.DOMDocument.3.0");
    if( FAILED(hr) )
    {
        return 0;
    }
    if( FALSE == pDoc->load(_bstr_t("D:\\Book.xml")) )
        return 0;  

    //输出XML文件所有内容
    cout<<"----------- Book.xml --------------"<<endl;
    cout<<pDoc->xml<<endl;
    cout<<"-----------------------------------"<<endl;  

    //选择内容的根节点
    MSXML2::IXMLDOMElementPtr pElem = NULL;
    pElem = pDoc->selectSingleNode("catalog");
    if(pElem==NULL)
        return 0;  

    unsigned int nBookNum = pElem->childNodes->length;
    if( nBookNum == 0)
        return 0;  

    cout <<"Their are "<< nBookNum << " book items in Book.xml file."<<endl;  

    for(int i=0; i < nBookNum; i++)
    {
        MSXML2::IXMLDOMNodePtr pBookNode = pElem->childNodes->item[i];
        if(pBookNode==NULL)
            return 0;  

        //读取book节点的id属性
        MSXML2::IXMLDOMNodePtr pId = pBookNode->attributes->getNamedItem("id");
        cout<<"Book ID: "<<pId->text<<"\t";  

        //读取book节点下author子节点
        MSXML2::IXMLDOMNodePtr pAuthorNode = pBookNode->selectSingleNode("author");
        if(pAuthorNode==NULL)
        {
            cout<<"Author: Error\t";
        }
        else
        {
            cout<<"Author: "<< pAuthorNode->text<< "\t";
        }
        cout<<endl;
    }
    CoUninitialize();
    return 0;
}  

输出结果:

5. COM智能指针

在示例代码中,我们看到使用了IXMLDOMElementPtr , IXMLDOMNodePtr 等智能指针,在MSDN中,并不能查到关于IXMLDOMElementPtr的信息,而只有IXMLDOMElement,实际上后缀带有Ptr的是对应的COM接口的智能指针。在msxml3.tlh中,可以找到如下定义:

_COM_SMARTPTR_TYPEDEF(IXMLDOMElement, __uuidof(IXMLDOMElement));

_COM_SMARTPTR_TYPEDEF宏用于定义一个_com_ptr_t 对象,_com_ptr_t封装了COM接口,称之为智能指针,该模板类用于负责资源的分配和释放,内部调用QueryInterface,AddRef,Release等IUnknown的函数。避免了编程人员对这些繁琐的操作一一处理。

对上述宏展开后,就定义了智能指针 IXMLDOMElementPtr,其封装了IXMLDOMElement接口。

【转】msxml 操作xml

时间: 2024-10-05 07:03:25

【转】msxml 操作xml的相关文章

msxml 操作xml

1.简介 在.NET平台,微软为C#或托管C++程序员提供了丰富的类库,用以支持各种需求,其中就有对XML文件操作的丰富的类.例如XMLDocument, XmlElement等.但是C++标准库中并未提供相应的库.本地开发的C++程序员一般采用开源类库实现对XML文件的操作,例如比较优秀的TinyXML.TinyXML是开源且可以任意免费使用的类库,可以免费用于商业软件中,因此使用者很多.但是在项目中维护第三方类库有时比较麻烦,因此一些开发人员希望避免使用第三方的工具.微软提供的MSXML可以

VC MSXML 操作 XML 入门

最近对XML有了些兴趣,准备稍稍涉猎一下.百度了相关的文章,试着写了一个程序,记录下来以资备忘. 我的开发环境:Win7 32位OS.VS2012. OK,开始动手. PS:至于相关理论之类的就让大神大仙大侠大牛们去操心吧,我么就秉承拿来主义,能用就行啦. 启动Visual Studio 2012. [文件]→[新建]→[项目] 新建一个"MfcXmlTest"的MFC项目.[确定] [下一步] 选中"基于对话框",取消"使用Unicode库".

delphi操作xml学习笔记 之一 入门必读

Delphi 对XML的支持---TXMLDocument类 Delphi7 支持对XML文档的操作,可以通过TXMLDocument类来实现对XML文档的读写.可以利用TXMLDocument把XML文档读到内存中,从而可以进行编辑.保存操作.TXMLDocument类是通过DOM(文档对象模型)接口来访问XML文档中的各个元素的.对于DOM接口的实现有多种方式,Delphi支持的方式有:1)微软的MSXML SDK,这种方式是通过COM对象来实现:2) Apache 的Xerces的实现方式

Tinyxml 操作XML

对于xml文件,目前的工作只是集中在配置文件和作为简单的信息文件来用,因此我不太喜欢使用msxml这种重量级的xml解析器,特别是使用msxml解析xml涉及到复杂的com类型转换,更是令人感觉繁琐.因此对于简单的xml文件的解析,我更愿意使用开源的TinyXml. 首先介绍一下TinyXml吧.TinyXML是目前非常流行的一款基于DOM模型的XML解析器,简单易用且小巧玲珑,非常适合存储简单数据,配置文件,对象序列化等数据量不是很大的操作,其主页是:http://www.grinningli

Delphi操作XML简介

参考:http://www.delphifans.com/InfoView/Article_850.html Delphi 7支持对XML文档的操作,可以通过 TXMLDocument类来实现对XML文档的读写.可以利用TXMLDocument把XML文档读到内存中,从而可以进行编辑.保存操作.TXMLDocument类是通过DOM(文档对象模型)接口来访问XML文档中的各个元素的.对于DOM接口的实现有多种方式,Delphi 支持的方式有 1)微软的MSXML SDK,这种方式是通过COM对象

VC++中操作XML(MFC、SDK)转

[转]VC++中操作XML(MFC.SDK) XML在Win32程序方面应该没有在Web方面应用得多,很多Win32程序也只是用XML来存存配置信息而已,而且没有足够的好处的话还不如用ini.VC++里操作XML有两个库可以用:MSXML和XmlLite.MSXML又细分了两种接口:DOM和SAX2.XP没自带有XmlLite,只自带有2.x.3.x版的MSXML,不支持SAX2(需要MSXML 4.0以上),所以优先使用DOM.DOM是以COM形式提供的,VC++里调用DOM可以分3种方法:1

史上最最靠谱,又双叒叒简单的基于MSXML的XML解析指南-C++

目录 史上最最靠谱,又双叒叒简单的基于MSXML的XML解析指南 流程设计 xml信息有哪几种读取形式(xml文件或wchar) 如何选取节点,and取节点属性有哪些方法? IXMLDOMNode与IXMLDOMElement接口有何联系.区别 节点如果是数组,怎么操作? 如何为属性插入属性 字符串的转换与输出 主要代码 史上最最靠谱,又双叒叒简单的基于MSXML的XML解析指南 最近做C++相关的项目,遇到同时使用COM和MSXML来解析XML文件中信息的问题,这类问题如果做MFC开发也会经常

php操作xml小结

<?php #php操作xml,SimpleXMLElement类小结 header('Content-type:text/html;charset=utf-8;'); //1.构造函数 /* $xmlstring=<<<XML <?xml version="1.0" encoding="utf-8"?> <note  xmlns:b="http://www.w3school.com.cn/example/&quo

使用Dom4j操作XML数据

--------------siwuxie095 dom4j 是一个非常优秀的 Java XML 的 API, 用来读写 XML 文件 和操作 XML 数据 特点:性能优异.功能强大.极端易用 dom4j 的下载链接:http://www.dom4j.org/dom4j-1.6.1/ 将 dom4j-1.6.1.zip 解压一览: 工程名:TestDom4j 包名:com.siwuxie095.dom4j 类名:Test.java 打开资源管理器,在工程 TestDom4j 文件夹下,创建一个