XMLLite解析xml


XmlLite是一个简易的XML Parser,使用COM组件方式实现,在Vista及Server2003sp2以后都有提供。头文件和库文件在Windows SDK中,一般随Visual Studio 2005及以后安装都会有,如果另外装了Windows SDK也有提供。
首先是引用:
#include <xmllite.h>
#pragma comment (lib, "xmllite.lib") 


1. XmlLite解析XML文件
微软的XmlLite样例使用了ATL库里的CComPtr<>模板类来简化操作,不会用orz 实际上直接使用IXmlReader接口来做也是可以的。但是需要自己在最后手动调用释放方法:IXmlReader::Release()。


这里先说从XML文件来解析,XmlLite使用了不知道Windows SDK在哪提供的IStream接口,可以直接参照样例里的办法来创建一个来自文件的IStream对象,即使用Windows Shell的函数:SHCreateStreamOnFile()。实际上这个函数可以创建一个新文件并写入,具体可以调整第二个flag参数。初始化XmlReader的大概代码如下:


IStream* pFileStream = NULL;
IXmlReader* pReader = NULL;
::SHCreateStreamOnFile("filename.txt", STGM_READ, &pReader);
CreateXmlReader(__uuidof(IXmlReader), (void**)&pReader, NULL);
pReader->SetInput(pFileStream);


如果是写入XML
    HRESULT hr = S_OK;
    IStream *pOutFileStream = NULL;
    IXmlWriter *pWriter = NULL;
    //Open writeable output stream
    if (FAILED(hr = SHCreateStreamOnFile(szFilePath, STGM_CREATE | STGM_WRITE, &pOutFileStream)))
    {
        wprintf(L"Error creating file writer, error is %08.8lx", hr);
        HR(hr);
    }


    if (FAILED(hr = CreateXmlWriter(__uuidof(IXmlWriter), (void**) &pWriter, NULL)))
    {
        wprintf(L"Error creating xml writer, error is %08.8lx", hr);
        HR(hr);
    }
IXmlReader接口的方法实际并不复杂,负责读取XML文件的只有Read()和ReadValueChunk()两个,实际只有前者有点用。通过不停地调用Read()方法,可以知道当前XmlLite走到了哪个XML元素上,然后调用一系列GetXXX方法就能获得当前元素的文本、属性值、CDATA等等了。
XmlNodeType nodeType;
while (S_OK == pReader->Read(&nodeType)) {
    switch (nodeType) {
        // analyze type of the node
    }
}


Read方法可以获知当前节点是一个什么节点,通过XmlNodeType的枚举类型来看即可:是XML Declaration?Element?EndElement(即</element_name>)等等。




但是每个Read会跳过当前元素的所有属性,继续下一个元素,因此XmlReader不能还原XML的树形结构,只能单向往前。


当走到一个元素以后可以使用MoveToAttributeByName或者MoveToFirstAttribute等,然后再使用GetValue来获取属性的值。另外由于移动了XmlReader,因此需要使用MoveToElement回到元素上,再继续下一次Read().


const TCHAR* szValue = NULL;
pReader->GetLocalName(&szValue, NULL);    // get element name
pReader->MoveToFirstAttribute();    // move reader to the first attribute of this xml element
pReader->GetValue(&szValue, NULL);    // get attribute value
pReader->MoveToElement();            // move back to element from some attribute

你可能感兴趣的:(XMLLite解析xml)