浅谈如何使用tinyxml解析xml文件

来源:互联网 发布:origins蘑菇水 知乎 编辑:程序博客网 时间:2024/06/10 01:55

        前段时间在做一个工程,里面涉及到了解析出一些外部传入的xml的字段属性值,因为刚毕业工作半年,所以之前还不知道有xml的解析工具,照样像在学校一样很傻很天真地将其当做字符串来处理解析出字段值,工程代码提交时却遭到了鄙视,囧...然后看着长长一大段很占篇幅的xml逐字符解析,在听取导师的建议后,学习了一下xml的解析工tinyxml,感觉确实不错,现将使用方法总结如下:

        首先,要使用tinyxml这个解析工具,百度一下就能搜到很多它的源码,最好是连其对应的静态lib库一起找到下载,这样便于工程中库的加载解析,如果没有静态库的话,就自己用它的源码生成一个,加载到要使用的工程中。至于静态库如何生成,这里不再赘述。另外因为,在C/C++工程中,一般都是直接接收一个外界定义好的xml进行解析,所以用tinyxml打印输出一个xml的方法这里也不再赘述,百度一下就会搜到很多。下面直接说说我用tinyxml的解析,首先需要知道在tinyxml中,根据XML的各种元素来定义了一些类:
        TiXmlBase:整个TinyXML模型的基类。
        TiXmlAttribute:对应于XML中的元素的属性。
        TiXmlNode:对应于DOM结构中的节点。
        TiXmlComment:对应于XML中的注释。
        TiXmlDeclaration:对应于XML中的申明部分,即<?versiong="1.0" ?>。
        TiXmlDocument:对应于XML的整个文档。
        TiXmlElement:对应于XML的元素。
        TiXmlText:对应于XML的文字部分。
        TiXmlUnknown:对应于XML的未知部分。
        TiXmlHandler:定义了针对XML的一些操作。

这个是你要进行解析需知道的基础,因为它涉及到你程序中需要定义的句柄。有了这个基础后,我随意百度了一个xml进行解析示例,xml如下:

 

<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<ZXML>
    
<ZAPP>
         
<VBS_RUNTIME_PARAMS>
               
<BROADCAST_VERSION info="版本">8</BROADCAST_VERSION>
               
<Broadcast>
                
<FileCount info="资源文件个数">69</FileCount>
                
<SOURCE_1>
                    
<ID info="图片编号">1</ID>
                    
<Version info="图片版本">1</Version>
                    
<Path info="图片路径">/mnt/share/1.bmp</Path>
                    
<FileMode info="文件处理模式">0</FileMode>
                
</SOURCE_1>
                
<SOURCE_2>
                    
<Path info="图片路径">/mnt/share/2.bmp</Path>
                    
<ID info="图片编号">2</ID>
                    
<Version info="图片版本">1</Version>
                    
<FileMode info="文件处理模式">0</FileMode>
                
</SOURCE_2>
                .
                
</Broadcast>
         
</VBS_RUNTIME_PARAMS>
    
</ZAPP>
</ZXML>



如果你有数据结构中树的基础知识会更好理解,tinyxml工具解析的大致构造就是按照树形结构的思想来的,一开始肯定是要获取到这个xml文档,所以需要定义一个文档句柄TiXmlDocument,这里就使用TiXmlDocument root吧,然后查看tinyxml的源码,可以看到这个句柄对应有个LoadFile()加载xml的方法,括号内填入对应xml文件所在的路径,这样xml文件就已经加载到你的程序中了,root就是这个xml文档对应的句柄了。有了这个文档句柄,第二步当然是要开始解析这个xml文档中的具体元素对应的属性值了,这里我们继续参照上面所罗列的操作类列表,既然要解析具体元素对应的属性值,肯定是需要用TiXmlElement这个元素类了,再看这个xml文件,因为<ZXML></ZXML>这个元素是在最外层的,所以按照tinyxml解析树的思想,它就是对应的最原始的父节点。定义一个元素节点句柄TiXmlElement  *parentNode,然后查看TiXmlElement对应类的源码,会发现有一个找父节点(根节点)的方法RootElement,调用parentNode->RootElement(),这样就解析出了<ZXML></ZXML>这个元素,然后剩余的都按这种思想解析出<ZAPP><ZAPP>,仍旧定义一个元素句柄TiXmlElement  *FirstChild,FirstChild->FirstChildElement()取到这个元素,同样方法取到下面的元素,具体要取属性值的时候,调用元素的Attribute(),括号内输入对应的属性字段就可以取到这个字段对应等号后的属性值了,如已经解析出<ID></ID>这个节点元素时,它对应的Attribute("info“)的值即为字符串”图片编号“,而要取1就需要TiXmlText了,总之对照着对应类的源码中的具体方法解析还是挺简单的。

0 0
原创粉丝点击