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

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/joelcat/article/details/78643799
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

猜你喜欢

转载自blog.csdn.net/joelcat/article/details/78643799