c++ libxml2 简明入门使用教程

libxml2常用库函数详解地址

一 : 首先认识一下几个libxml2 中常用的指针

  • xmlDocPtr

    用于表示XML 文档的指针

  • xmlNodePtr

    用于表示XML 节点的指针

  • xmlChar

    用于表示XML 中的字符串(属性值等) ,unsigned char 的重定义

  • xmlAttr

用于表示XML 属性的指针

读取(解析)XML

  • 首先需要得到xmlDocPtr, 得到xmlDocPtr 有两种方法,第一种:从文件中读取, 第二种:从内存中读取字符串

  • [ ] 从文件中读取

string xmlFileName = "c:\\q.xml";
xmlDocPtr m_xmlDoc = xmlReadFile(xmlFileName.c_str(), 0, XML_PARSE_NOBLANKS);
  • [ ] 从内存中读取
string xmlStr = "xxxxxx";
xmlDocPtr m_xmlDoc = xmlReadMemory(xmlStr.c_str(), (int)xmlStr.length(), 0, "UTF-8", XML_PARSE_RECOVER);
  • 解析节点
//获取根节点
xmlNodePtr node = xmlDocGetRootElement(m_xmlDoc);
//获取到根节点的的子节点
xmlNodePtr spChildNode = node->children;
while (spChildNode)
{
    //如果是节点
    if(spChildNode->type == XML_ELEMENT_NODE)
    {
        //获取节点的属性
    }
    //移动到下一个节点
    spChildNode = spChildNode->next;
}
  • 获取节点的属性
// <node name = "pName" age = "pAge"/>
//拿到属性链表
xmlAttr *atrNode = spChildNode->properties;
while (atrNode)
{
    //如果是属性节点
    if(atrNode->type ==XML_ATTRIBUTE_NODE)
    {
        //name 即为 key
        const xmlChar* key = atrNode->name;
        //通过xmlGetProp(xml节点, xml属性节点) 获取属性节点的值;
        xmlChar *value = xmlGetProp(spChildNode, atrNode->name);
    }
    atrNode = atrNode->next;
}
  • 读取纯文本节点
//<a>我是文本</a>

xmlNodePtr spChildNode = node->children;
while (spChildNode)
{
    //如果是节点
    if(spChildNode->type == XML_ELEMENT_NODE)
    {
        xmlChar *text = spChildNode->content;
    }
    //移动到下一个节点
    spChildNode = spChildNode->next;
}

解析xml 思路

graph TD
A[获得xmlDocPtr] --> |是否为空| B(获得根节点)
B --> |是否有根节点| C{遍历根节点的子节点}
C ==> |是节点| D[遍历节点的子节点]
C --> |获取属性| E[遍历获取属性]
C --> |获取文本| F[文本节点]
D --> |获取属性| E[属性]
D --> |文本节点| F[文本]

创建XML

  • 创建文档对象指针
//xmlDocPtr xmlNewDoc (const xmlChar * version)
xmlDocPtr doc = xmlNewDoc((const xmlChar*)"1.0");
  • 创建一个节点
//#define BAD_CAST (xmlChar *)
//BAD_CAST 是在xmlstring.h 中定义
xmlNodePtr columnsNode = xmlNewNode(0, BAD_CAST "tr");
  • 将节点添加到文档
//xmlNodePtr xmlDocSetRootElement(xmlDocPtr doc, xmlNodePtr root);

xmlDocSetRootElement(doc, columnsNode);
  • 节点添加到节点之下
xmlNodePtr subNode = xmlNewNode(0, BAD_CAST "td");
//xmlNodePtr xmlAddChild (xmlNodePtr parent, xmlNodePtr cur)
xmlAddChild(columnsNode, subNode);
  • 添加属性到节点
string nameValue = "神奇";
//xmlAttrPtr xmlNewProp (xmlNodePtr node, const xmlChar * name, const xmlChar * value)
xmlNewProp(subNode, BAD_CAST "name", BAD_CAST nameValue.c_str());
  • 设置节点的属性(修改)
string nameValue = "神奇";
//xmlChar * xmlGetProp (xmlNodePtr node, const xmlChar * name)
xmlSetProp(subNode, BAD_CAST "name", BAD_CAST nameValue.c_str());
  • 添加文本节点
xmlNodePtr node;
//void xmlNodeAddContentLen(xmlNodePtr cur,  const xmlChar * content,  int len)
string text = "我是文本";
int textLen = (int)text.length();
xmlNodeAddContentLen(node, (xmlChar*)text.c_str(), textLen);

保存XML

  • 获取xmlDocPtr的字符串文本
//void xmlDocDumpFormatMemoryEnc(xmlDocPtr out_doc,xmlChar ** doc_txt_ptr,int * doc_txt_len, constchar * txt_encoding, int format);

//format 为 1 表示格式化
xmlChar *outbuf;
int len = 1000; xmlDocDumpFormatMemoryEnc(m_xml->m_xmlDoc, &outbuf, &len, "UTF-8", 1);
  • 保存到文件
//xmlSaveFile(const char *filename, xmlDocPtr cur)
xmlSaveFile("c:\q.xml", m_xmlDoc);

理解libxml2, 你需要理解链表, 这样才会领会libxml2的神奇,才会理解libxml2的函数, 才会熟练使用libxml2
  • 5
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
libxml是一个广泛使用的XML库,用于分析、创建、操作XML文档。下面是使用libxml库的教程: 1. 安装libxml库:首先,你需要在你的开发环境中安装libxml库。你可以从libxml官方网站(http://xmlsoft.org)下载源代码,并根据提供的指南进行编译和安装。 2. 包含头文件:在你的项目中包含libxml的头文件。例如:\#include <libxml/parser.h> 和 \#include <libxml/tree.h>。 3. 解析XML文件:使用libxml库可以轻松地解析XML文件。首先,你需要创建一个xmlDocPtr类型的指针来存储解析后的XML文档。然后,使用xmlReadFile函数将XML文件读取到xmlDocPtr中。 4. 遍历文档树:解析XML文件后,你可以使用libxml提供的函数来访问和遍历文档树。例如,使用xmlDocGetRootElement函数获取根元素,然后使用xmlNodePtr指针遍历子元素。 5. 获取节点信息:你可以使用libxml提供的函数获取节点的信息,例如节点名、属性、文本内容等。使用xmlNodeGetName函数获取节点名,使用xmlNodeGetContent函数获取文本内容。 6. 创建和修改节点:你也可以使用libxml库创建和修改节点。使用xmlNewNode函数创建一个新的节点,使用xmlNewTextChild函数在指定节点下添加子节点。 7. 释放内存:当你完成对XML文档的操作后,记得使用xmlFreeDoc函数释放分配的内存。 总结:libxml是一个功能强大且易于使用的XML库,它提供了许多函数和工具来解析、创建和操作XML文档。通过上述步骤,你可以很容易地开始使用libxml库来处理XML文件。在编写代码时,记得查阅libxml的文档和示例代码,这将帮助你更好地了解和使用该库。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值