TinyXml解析复杂xml字符串总结
来源:互联网 发布:哪种理财方式最好知乎 编辑:程序博客网 时间:2024/04/29 12:33
TinyXML是一个开源的解析XML的解析库,能够用于C++,能够在Windows或Linux中编译。这个解析库的模型通过解析XML文件,然后在内存中生成DOM模型,从而让我们很方便的遍历这棵XML树。tinyXML资源包见本人上传的资源,需要可下载!
下面我用个简单的例子说明如何使用tinyXML操作xml文件。在讲例子之前我先说说tinyXML中主要类和xml文档之间的对应关系。下面是tinyXML中主要class的类图,反应各个类之间的静态关系。
TiXmlBase是所有类的基类,TiXmlNode、TiXmlAttribute两个类都继承来自TiXmlBase类,其中TiXmlNode类指的是所有被<...>...<.../>包括的内容,而xml中的节点又具体分为以下几方面内容,分别是声明、注释、节点以及节点间的文本,因此在TiXmlNode的基础上又衍生出这几个类TiXmlComment、TiXmlDeclaration、TiXmlDocument、TiXmlElement、TiXmlText、TiXmlUnknown,分别用来指明具体是xml中的哪一部分。TiXmlAttribute类不同于TiXmlNode,它指的是在尖括号里面的内容,像<... ***=...>,其中***就是一个属性。这块我具体用一个xml文档说明一下,内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<phonebook>
<!--one item behalfs one contacted person.-->
<item>
<name>miaomaio</name>
<addr>Shaanxi Xi'an</addr>
<tel>13759911917</tel>
<email>miaomiao@home.com</email>
</item>
<item>
<name>gougou</name>
<addr>Liaoning Shenyang</addr>
<tel>15840330481</tel>
<email>gougou@home.com</email>
</item>
<!--more contacted persons.-->
</phonebook>
*像TiXmlDeclaration指的就是<?xml version="1.0" encoding="UTF-8"?>,
*像TiXmlComment指的就是<!--one item behalfs one contacted person.-->、 <!--more contacted person s.-->,
*像TiXmlDocument指的就是整个xml文档,
*像TiXmlElement指的就是<phonebook>、<item>、<name>、<addr>等等这些节点,
*像TiXmlText指的就是‘gougou’、‘15840330481’这些夹在<item>与</item>、<name>与</name>、<addr> 与*</addr>之间的文本文字,
*像TiXmlAttribute指的就是<?xml version="1.0" encoding="UTF-8"?>节点中version、encoding,
*除此之外就是TiXmlUnknown。
以上转载自别人博客!
有关TinyXml解析的文章很多,比如:
http://acnchen.i.sohu.com/blog/view/66703840.htm C++中使用tinyXML简单例子
http://panpan.blog.51cto.com/489034/104961/ C++ XML解析之TinyXML篇
这两篇文章都不错,值得一看!
然而,对于复杂的xml字符串,这两篇文章都没有提到如何解析。于是,我研究了下,大体思路是:复杂的xml的特点是节点很多,并且经常出现节点嵌套节点。如何把每个节点的tag字段和内容字段提取出来是一个难题。这里我想到的思路是:对每一个节点,如果存在子节点,就递归地提取子节点;如果不存在子节点,就提取该节点。通过使用递归函数能够保证所有的节点都被提取到!示例代码如下:
#include "tinyxml.h"
#include <vector>
//递归提取每个节点
void GetEleNameAndValue(TiXmlElement* pEle)
{
TiXmlElement* pEleTemp=NULL;
pEleTemp=pEle;
if(pEleTemp)
{
TiXmlElement* childEleTemp=pEleTemp->FirstChildElement();
while(childEleTemp)
{
GetEleNameAndValue(childEleTemp);
childEleTemp=childEleTemp->NextSiblingElement();
}
if(childEleTemp==NULL)
{
const char* pText=pEleTemp->GetText();
if(pText)
{
std::cout << pEleTemp->Value() <<":"<<pEleTemp->GetText()<<std::endl;
}
}
}
}
int main()
{
std::string xmlString = "<?xml version=\"1.0\" encoding=\"GBK\"?>\
<nlp>\
<version>1.0.0.5800</version>\
<rawtext>大话西游</rawtext>\
<parsedtext>大话西游 </parsedtext>\
<result>\
<focus>app</focus>\
<action>\
<operation>launch</operation>\
</action>\
<object>\
<name>大话西游</name>\
</object>\
</result>\
<result>\
<focus>music</focus>\
<action>\
<operation>play</operation>\
</action>\
<object>\
<name>大话西游</name>\
</object>\
</result>\
<result>\
<focus>dialog</focus>\
<object>\
<name>大话西游</name>\
<topic>namecard</topic>\
</object>\
<content>我搜索了一下【大话西游】:《大话西游》是周星驰电影公司和大陆西影合作拍摄的一部经典的无厘头搞笑片,成就了大话的经典传奇。《大话西游》把周星驰推到了后现代主义喜剧大师的位置,进而推动了无厘头文化在中国的流行。电影“大话西游”分为《月光宝盒》和《仙履奇缘》这两部。</content>\
</result>";
TiXmlDocument* myDocument = new TiXmlDocument();
myDocument->Parse(xmlString.c_str()); //提取xml字符串的声明部分
TiXmlDeclaration* XmlDeclaration = myDocument->FirstChild()->ToDeclaration();
std::cout<<"----------XML Declaration:------------------"<<std::endl;
if(XmlDeclaration)
{
std::cout<<"Version: "<<XmlDeclaration->Version()<<std::endl;
std::cout<<"Standalone: "<<XmlDeclaration->Standalone()<<std::endl;
std::cout<<"Encoding: "<<XmlDeclaration->Encoding()<<std::endl;
}
//
TiXmlElement* rootElement = myDocument->RootElement(); //Class
TiXmlElement *ChildElement = rootElement->FirstChildElement();
while ( ChildElement )
{
GetEleNameAndValue(ChildElement);
ChildElement = ChildElement->NextSiblingElement();
}
return 0;
}
- TinyXml解析复杂xml字符串总结
- CMarkup与tinyXml直接解析XML字符串
- CMarkup与tinyXml直接解析XML字符串
- CMarkup与tinyXml直接解析XML字符串
- tinyxml 解析XML字符串,可加载远程XML
- TinyXML 解析中文XML
- TinyXML解析xml文档
- 使用TinyXML解析XML
- TinyXML解析XML
- TinyXml 解析 XML
- TinyXML解析xml文档
- xml解析器tinyXML
- TinyXML 库解析XML
- 利用TinyXML解析XML
- xml解析器---TinyXML
- Tinyxml解析xml文件
- tinyxml解析xml文件
- 使用tinyxml封装或解析xml形式字符串
- Tesseract3.01 训练步骤
- Eclipse中跟踪调试Android系统源代码
- Git使用
- 5分钟内搞定 Tomcat 的 SSL 配置
- 有关线程方面
- TinyXml解析复杂xml字符串总结
- Unity3D插件大全
- Eclipse中搭建Android开发环境
- openfire centos 上安装
- Java基础学习资料
- MIPS 平台下 I/O 端口的读写--以龙芯为例
- gcc编译背后(第一部分:预处理和编译)
- java中int类型转换成String类型的三种方法
- hdoj1035