TinyXML2的基本使用之遍历和文本提取

6 篇文章 1 订阅

XML是一种标记语言,被广泛用来作为跨平台之间交互数据的形式,主要针对数据的内容,通过不同的格式化描述手段(XSLT,CSS等)可以完成最终的形式表达(生成对应的HTML,PDF或者其他的文件格式)。

而TinyXML2是一个开源、简单、小巧、高效的C++ XML解析器,由于XML是由节点组成的,节点之间是树形结构,有根节点、父节点、子节点、兄弟节点等。所以可以把其当做树来处理和使用。

下面我们来看一下在C++中使用TinyXML2对XML文件进行遍历和提取信息的方法。

1.TinyXML2的相关数据类型

  • XMLDocument:代表整个XML文件。
  • XMLNode:XML文件是由节点组成的,节点之间是树形结构,所以就有根节点、父节点、子节点、兄弟节点。
  • XMLElement:对应于XML的元素
  • XMLAttribute:对应于XML中的元素的属性。
  • XMLText:对应于XML的文字部分
  • XMLComment:XML中的注释。
  • XmlUnknown:对应于XML的未知部分。
  • XmlHandler:定义了针对XML的一些操作。

可以根据需要使用上面的类型来定义对象。

2.TinyXML2查看的相关函数

  1. 加载文件信息,即要处理哪个文件
XMLDocument doc; 
doc.LoadFile(filename);//加载要处理的xml文档
if(doc.ERROR()){
	//检查是否打开成功
	cout << "open failed!" << endl;
}

类似C语言中文件打开fopen后,需要检查打开是否失败,有函数ErrorID。正常打开返回XML_SUCCESS=0,函数原型为:

XMLError  ErrorID() const {
    return _errorID;
}

XMLError:错误信息使用枚举值。

enum XMLError {
    XML_SUCCESS = 0,
    XML_NO_ATTRIBUTE,
    XML_WRONG_ATTRIBUTE_TYPE,
    XML_ERROR_FILE_NOT_FOUND,
    XML_ERROR_FILE_COULD_NOT_BE_OPENED,
    XML_ERROR_FILE_READ_ERROR,
    XML_ERROR_PARSING_ELEMENT,
    XML_ERROR_PARSING_ATTRIBUTE,
    XML_ERROR_PARSING_TEXT,
    XML_ERROR_PARSING_CDATA,
    XML_ERROR_PARSING_COMMENT,
    XML_ERROR_PARSING_DECLARATION,
    XML_ERROR_PARSING_UNKNOWN,
    XML_ERROR_EMPTY_DOCUMENT,
    XML_ERROR_MISMATCHED_ELEMENT,
    XML_ERROR_PARSING,
    XML_CAN_NOT_CONVERT_TEXT,
    XML_NO_TEXT_NODE,
    XML_ELEMENT_DEPTH_EXCEEDED,

    XML_ERROR_COUNT
};
  1. 获取根节点:(因为获取跟节点其实底层调用的还是FirstChildElement,所以直接使用FirstChildElement),因为xml文件是树形结构的文件,所以势必会有根节点、父子节点、兄弟节点。
XMLElement *root = doc.RootElement(); //获取根节点
  1. 获取孩子节点
//函数声明:
XMLElement *FirstChildElement();//获取第一个孩子结点
XMLElement *FirstChildElement(string label);//获取第一个标签为label的孩子结点
//实际使用:
//获取根节点下的第一个节点
XMLElement *curNode1 = root->FirstChildElement();
//获取根节点下的第一个节点的第一个"item"节点
XMLElement *curNode2 = root->FirstChildElement()->FirstChildElement("item");

因为FirstChildElement返回值还是XMLElement类型的指针(类似输出流运算符返回流对象引用一样),所以还可以继续使用FirstChildElement获取接下来的孩子节点。

  1. 使用NextSiblingElement函数获取兄弟节点,从而实现遍历
//返回下一个为item的的兄弟节点
XMLElement *nextNode = curNode->NextSiblingElement("item");
  1. 获取节点的文本信息,使用函数GetText()
//获取当前节点下的title节点中的文本信息,存放到string字符串中
string title = curNode->FirstChildElement("title")->GetText();

通过上面的几个函数,就可以实现对整个xml文档的遍历和文本提取了。

tinyxml2是一个用于解析和操作XML文档的C++库。它提供了一组简单易用的API,可以方便地遍历XML文档的节点。 要遍历一个XML文档,首先需要创建一个XMLDocument对象,并通过其LoadFile()方法加载XML文件。然后,可以通过XMLDocument对象的FirstChild()方法获取XML文档的根节点XMLElement对象。 接下来,可以使用XMLElement对象的FirstChildElement()方法获取第一个子节点,并通过NextSiblingElement()方法遍历其余的兄弟节点。可以使用Value()方法获取节点的名称,使用GetText()方法获取节点的文本内容。 此外,还可以使用FirstChildElement()和NextSiblingElement()方法在节点的子节点中进行遍历,以及使用Attribute()方法获取节点的属性值。 下面是一个示例代码,演示了如何使用tinyxml2库遍历一个XML文档: ```cpp #include "tinyxml2.h" #include <iostream> using namespace tinyxml2; int main() { XMLDocument doc; if (doc.LoadFile("example.xml") == XML_SUCCESS) { XMLElement* root = doc.FirstChildElement(); if (root) { for (XMLElement* child = root->FirstChildElement(); child; child = child->NextSiblingElement()) { std::cout << "Node name: " << child->Value() << std::endl; std::cout << "Node text: " << child->GetText() << std::endl; for (XMLElement* subChild = child->FirstChildElement(); subChild; subChild = subChild->NextSiblingElement()) { std::cout << "Subnode name: " << subChild->Value() << std::endl; std::cout << "Subnode text: " << subChild->GetText() << std::endl; } } } } return 0; } ``` 上述代码中,假设存在一个名为"example.xml"的XML文件,代码加载该文件并遍历了其节点及其子节点,并输出了节点的名称和文本内容。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值