大家好,欢迎来到IT知识分享网。
有人说xml格式文件(简称xml)就是一个小型的数据库,对数据库的任何操作可以在xml格式上完成后,笔者对数据库以及xml的使用还没有达到这种地步,所以也就没有权利评价这句话,但是从这句话我们可以知道xml的重要性。一般的xml用作保存一些配置信息,或者是类的序列化,配置文件使用的比较多。既然使用了xml,那就需要寻找一种解析xml的利器。现提供的解析xml的利器非常的多,比如有通用的DOM(DOM 是用与平台和语言无关的方式表示 XML 文档的官方 W3C 标准,摘自:http://hi.baidu.com/dvvjktshrwdosve/item/13d9c0cab21a1e3398b498f4)、xmlparser、tinyXMl(C++实现开源)等,DOM解析工具功能强大,但是结构复杂,对于解析配置文件这样的小型的xml文件时杀鸡用牛刀。由于使用的次数和深度有限,本文就分享tinyxml的基本用法。
(一) tinyxml是开源的解析xml库,在遵循开源协议下可以查看和修改源代码,其基本的结构如下
1)TiXmlVisitor:是解析xml重要的访问器,负责遍历所有的xml节点,用户一般不会使用;
3)TiXmlNode:是除了属性类之外的所有的xml文档结构模型的父类,是一个比较实用的类,提供了对其父子兄弟节点的指针以及操作;
4)TiXmlAttribute:xml节点的属性类,其直接继承自TiXmlBase类,提供了对节点属性的操作;
5)TiXmlAttributeSet:管理一系列的属性类;
6)TiXmlElement:这是一个容器类,它包具有值,节点的名称,也可以包含其他的element、text、等,可以讲node转化为element方便用户操作;
7)TiXmlComment:xml的命令类,提供了对xml整体的操作
8)TiXmlText:是节点的值类,提供了对节点的值的操作
9)TiXmlDeclaration:xml的头描述信息的类,主要控制版本、编码等
10)TiXmlUnknown:解析工具无法识别的类,主要是不规范的节点
11)TiXmlDocument:是建立xml的核心类,是xml最顶层的节点类,包含其他多有的xml节点
12)TiXmlHandle:是提供的tinyXml中的工具,其不适宜tinyXml的结构,主要是包裹一个节点的指针,并进行空检查
13)TiXmlPrinter:是一些打印操作的类,一般不是很常用
(二)tiny操作下面的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>
</Broadcast>
</VBS_RUNTIME_PARAMS>
</ZAPP>
</ZXML>
1)建立xml
//建立xml的top节点,并设置名称为Test_2.xml
TiXmlDocument* document = new TiXmlDocument(“Test_2.xml”);
if(!document)
{
return;
}
//建立描述节点,设置了版本和字符编码,并添加到top节点
TiXmlDeclaration* declaration = new TiXmlDeclaration(“1.1.0”, “UTF-8”, “”);
if(!declaration)
{
return;
}
document->LinkEndChild(declaration);
//建立第二级节点,并添加到top节点
TiXmlNode* nodeZXML = new TiXmlElement(“ZXML”);
document->LinkEndChild(nodeZXML);
//建立第二级节点,添加到第一节点下
TiXmlNode* nodeZAPP= new TiXmlElement(“ZAPP”);
nodeZXML->LinkEndChild(nodeZAPP);
TiXmlNode* nodeVBS_RUNTIME_PARAMS = new TiXmlElement(“VBS_RUNTIME_PARAMS”);
nodeZAPP->LinkEndChild(nodeVBS_RUNTIME_PARAMS);
TiXmlNode* nodeBROADCAST_VERSION = new TiXmlElement(“BROADCAST_VERSION”);
nodeVBS_RUNTIME_PARAMS->LinkEndChild(nodeBROADCAST_VERSION);
//设置节点的值,并添加到节点上
TiXmlText* textBROADCAST_VERSION = new TiXmlText(“8”);
nodeBROADCAST_VERSION->LinkEndChild(textBROADCAST_VERSION);
nodeBROADCAST_VERSION->ToElement()->SetAttribute(“info”, “版本”);
TiXmlElement* nodeBroadcast = new TiXmlElement(“Broadcast”);
nodeBROADCAST_VERSION->LinkEndChild(nodeBroadcast);
//设置节点的属性值
TiXmlElement* nodeFileCount = new TiXmlElement(“FileCount”);
TiXmlText* countText = new TiXmlText(“69”);
nodeFileCount->LinkEndChild(countText);
nodeFileCount->SetAttribute(“info”, “资源文件个数”);
nodeBroadcast->LinkEndChild(nodeFileCount);
TiXmlElement* nodeSOURCE_1 = new TiXmlElement(“SOURCE_1”);
nodeBroadcast->LinkEndChild(nodeSOURCE_1);
TiXmlElement* nodeID_1 = new TiXmlElement(“ID”);
TiXmlText* textIDInfo_1 = new TiXmlText(“1”);
nodeID_1->LinkEndChild(textIDInfo_1);
nodeID_1->SetAttribute(“info”, “图片编号”);
nodeSOURCE_1->LinkEndChild(nodeID_1);
TiXmlElement* nodeVersion_1 = new TiXmlElement(“Version”);
TiXmlText* textVersionInfo_1 = new TiXmlText(“1”);
nodeVersion_1->LinkEndChild(textVersionInfo_1);
nodeVersion_1->SetAttribute(“info”, “图片版本”);
nodeSOURCE_1->LinkEndChild(nodeVersion_1);
TiXmlElement* nodePath_1 = new TiXmlElement(“Path”);
TiXmlText* textPathInfo = new TiXmlText(“1”);
nodePath_1->LinkEndChild(textPathInfo);
nodePath_1->SetAttribute(“info”, “图片路径”);
nodeSOURCE_1->LinkEndChild(nodePath_1);
TiXmlElement* nodeFileMode_1 = new TiXmlElement(“FileMode”);
TiXmlText* textFileModeInfo = new TiXmlText(“0”);
nodeFileMode_1->LinkEndChild(textFileModeInfo);
nodeFileMode_1->SetAttribute(“info”, “文件处理模式”);
nodeSOURCE_1->LinkEndChild(nodeFileMode_1);
2)读取xml
TiXmlDocument doc;
if(!doc.LoadFile(“test_2.xml”))
{
return;
}
//使用handle来遍历节点
TiXmlHandle* root = new TiXmlHandle(&doc);
if(!root)
{
return;
}
//获得指定的节点,并转化成TiXmlElement的类型,方便处理
TiXmlElement* element = root->FirstChild(“ZXML”).FirstChild(“ZAPP”).FirstChild(“VBS_RUNTIME_PARAMS”).FirstChild(“BROADCAST_VERSION”).ToElement();
if(!element)
{
return;
}
const char* val = NULL;
val = element->GetText();
if(val)
{
//版本号
std::string version = val;
}
val = element->Attribute(“info”);
if(val)
{
//版本属性
std::string info = val;
}
element = element->FirstChildElement(“Broadcast”)->FirstChildElement(“FileCount”);
if(!element)
{
return;
}
val = element->GetText();
if(val)
{
std::string count = val;
}
val = element->Attribute(“info”);
if(val)
{
std::string infoCount = val;
}
element = element->NextSiblingElement(“SOURCE_1”);
if(!element)
{
return;
}
element = element->FirstChildElement(“ID”);
if(!element)
{
return;
}
val = element->GetText();
if(val)
{
std::string IDText = val;
}
val = element->Attribute(“info”);
if(val)
{
std::string IDinfo = val;
}
element = element->NextSiblingElement();
if(!element)
{
return;
}
//获得节点的值
val = element->GetText();
if(val)
{
std::string verText = val;
}
//获得节点的属性
val = element->Attribute(“info”);
if(val)
{
std::string verInfo = val;
}
//下一个兄弟节点
element = element->NextSiblingElement();
if(!element)
{
return;
}
val = element->GetText();
if(val)
{
std::string pathText = val;
}
val = element->Attribute(“info”);
if(val)
{
std::string pathInfo = val;
}
element = element->NextSiblingElement();
if(!element)
{
return;
}
val = element->GetText();
if(val)
{
std::string nodeText = val;
}
val = element->Attribute(“info”);
if(val)
{
std::string nodeInfo = val;
}
element = element->Parent()->ToElement();
if(!element)
{
return;
}
element = element->NextSiblingElement();
if(!element)
{
return;
}
element = element->FirstChildElement(“Path”);
if(!element)
{
return;
}
val = element->GetText();
if(val)
{
std::string pathInfo = val;
}
3)修改xml文档
TiXmlDocument doc(“test_2.xml”);
if(!doc.LoadFile())
{
return;
}
TiXmlHandle* handle = new TiXmlHandle(&doc);
if(!handle)
{
return;
}
/增加节点的代码
TiXmlElement* element = handle->FirstChildElement().FirstChildElement(“ZAPP”).ToElement();
if(!element)
{
return;
}
//在element节点之前和之后插入一个节点
TiXmlElement* addNode_1 = new TiXmlElement(“AddNode_1”);
if(!addNode_1)
{
return;
}
//element->Parent()->InsertAfterChild(element, *addNode_1);
element->Parent()->InsertBeforeChild(element, *addNode_1);
TiXmlElement* addNode_2 = new TiXmlElement(“AddNode_2”);
if(!addNode_2)
{
return;
}
//增加节点的值
TiXmlText* text = new TiXmlText(“test_text”);
addNode_2->LinkEndChild(text);
element->InsertEndChild(*addNode_2);
*/
//重新设置属性,如果没有添加属性,有修改属性
TiXmlElement* element = handle->FirstChild(“ZXML”).FirstChild(“ZAPP”).FirstChild(“VBS_RUNTIME_PARAMS”).FirstChild(“BROADCAST_VERSION”).ToElement();
if(!element)
{
return;
}
element->SetAttribute(“info”, “版本新”);
//element->FirstChild()->setT
(三)注意事项
一般读取xml,大多数人喜欢使用std::tring接受解析的值,但是假如节点不存在返回的是char* 的NULL值,这样直接的传给string就会导致崩溃,一般先以char*接受然后验证是否为空。
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/157835.html