我们来自五湖四海,不为别的,只因有共同的爱好,为中国互联网发展出一分力!

C++中处理XML文件

2013年04月28日03:40 阅读: 12603 次

     写Unmanaged Code在.NET时代成为一种很悲惨的事,当你需要处理XML文件时,这种感觉会变得尤其强烈。FCL中的System.XML多简单啊,连Steve Ballmer都知道怎么用。

    事情不会总是那么理想的,如果你要在C/C++程序里处理XML怎么办呢?

    选择一:市面上的XML lib还是有几个的,最有名的当然是libXML。我一年前用过,很不错,我还特意写了一份简明教程,后来不知搁哪儿了。

    选择二:MS的MSXML,我要介绍的就是这个。

    先说一下在MSDN哪里找文档吧,往下看的时候也好有个参考:在Index里打:Windows Media Services 9 Series SDK=>Programming Reference=>Programming Reference (C++)=>XML DOM Interfaces (C++)。什么?Windows Media?呵呵,不错,我觉得这个guide反而是最清楚的,你直接找MSXML,得到的结果,我觉得还没这个好。

    在C程序里调用MSXML基本就是一堆COM接口,不过在Visual Studio里操作先要做点简单的设置:

    在你的Project里Add References=>COM标签=>Microsoft XML v4.0,5.0其实也有了,但因为是和Office一起发布的,觉得有点怪,不想用,反正也未必用什么很怪异的功能,4.0可以了。

 

    然后在加入这两行:

    #include <msXML2.h>
    #import <msXML4.dll>

    头文件和dll库。什么?在哪里加?头文件或者c/cpp文件啊,哪里合适放哪儿。

    然后就开始编程了,先定义两个必用的变量:

    IXMLDOMDocumentPtr XMLFile = NULL;
    IXMLDOMElement* XMLRoot = NULL;

    为什么是必用的?  汗...

    第一步当然是初始化COM:

    if(FAILED(CoInitialize(NULL))) ....

    接下来初始化XMLFile对象:

    if(FAILED(XMLFile.CreateInstance("MsXML2.DOMDocument.4.0"))) ...

    然后就可以加载XML文件了:

    _variant_t varXML(L"C:\\test.XML"); //L for unicode
    VARIANT_BOOL varOut;
    XMLFile->load(varXML, &varOut);

    取得root element:

    XMLFile->get_documentElement(&XMLRoot))

    取得第一级element:

    IXMLDOMNodeList* XMLChildNodes = NULL;
    XMLRoot->get_childNodes(&XMLChildNodes);

    遍历所有第一级element:

    IXMLDOMNode* currentNode = NULL;
    while(!FAILED(XMLChildNodes->nextNode(&currentNode)) && currentNode != NULL)

 

[1] [2] [3] [4] 下一页

分享到: 更多
蓝客门户
©2001-2017 中国蓝客联盟 版权所有.
关于蓝客联盟历史宗旨章程技术服务联系我们蓝客社区