版权声明:本文为博主原创文章,未经博主允许不得转载。 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);