通过libxml2更新XML的属性值和元素值
来源:互联网 发布:罗其胜网络班教程 编辑:程序博客网 时间:2024/06/08 17:08
场景:1.有时候配置软件的全局设置项时,需要用到键值对的存储方式。2.配置信息不多的情况下.数据库太重量级,文本文件对utf8编码又不好,即中文内容,这时候XML文件是最佳选择。
//这里使用的是libxml2-2.7.1版本库
#include <iostream>#include <string.h>#include <libxml/xmlmemory.h>#include <libxml/parser.h>#include <libxml/parserInternals.h>#include <libxml/HTMLparser.h>#include <libxml/HTMLtree.h>#include <libxml/tree.h>#include <libxml/xpath.h>#include <libxml/debugXML.h>#include <libxml/xmlerror.h>#include "libxml/encoding.h"//#include <tchar.h>using namespace std;void UpdateNodeValue(xmlNode* node, const char *value){ xmlChar *xml_value = xmlCharStrdup(value); xmlNodeSetContent(node, xml_value); xmlFree(xml_value);}void UpdateAttrValue(xmlNode* node, const char *attr_name, const char *value){ xmlChar *xml_prop_name = xmlCharStrdup(attr_name); xmlChar *xml_prop_value = xmlCharStrdup(value); xmlSetProp(node, xml_prop_name, xml_prop_value); xmlFree(xml_prop_value); xmlFree(xml_prop_name);}xmlXPathObjectPtr GetXPathObject(xmlDocPtr doc, const char* key){ //获取xpath上下文 xmlXPathContextPtr context = xmlXPathNewContext(doc); if (!context) { return NULL; } //获取xpath对象指针 xmlChar *xml_key = xmlCharStrdup(key); xmlXPathObjectPtr result = xmlXPathEvalExpression(xml_key, context); xmlFree(xml_key); //释放xpath上下文 xmlXPathFreeContext(context); // if (!result) { return NULL; } //结果为空 if (!result || xmlXPathNodeSetIsEmpty(result->nodesetval)) { return NULL; } return result;}//更新结点内容void UpdateXmlNodeValue(xmlDocPtr doc, const char *key, const char *value){ xmlXPathObjectPtr result = GetXPathObject(doc, key); if (!result) { return; } xmlNodeSetPtr nodeset = result->nodesetval; for (int i = 0; i < nodeset->nodeNr; i++) { //更新结点值 UpdateNodeValue(nodeset->nodeTab[i], value); } xmlXPathFreeObject(result);}//更新结点属性值void UpdateXmlNodeAttr(xmlDocPtr doc, const char *key, const char *attr_name, const char *value){ xmlXPathObjectPtr result = GetXPathObject(doc, key); if (!result) { return; } xmlNodeSetPtr nodeset = result->nodesetval; for (int i = 0; i < nodeset->nodeNr; i++) { UpdateAttrValue(nodeset->nodeTab[i], attr_name, value); } xmlXPathFreeObject(result);}xmlDocPtr BeginUpdate(const char *xml_path){ xmlInitParser(); xmlDocPtr doc = xmlParseFile(xml_path); return doc;}void EndUpdate(xmlDocPtr doc, const char *out_path){ xmlSaveFileEnc(out_path, doc, "UTF-8"); xmlFreeDoc(doc); xmlCleanupParser();}int main(int argc, char** argv){ xmlDocPtr doc = BeginUpdate("test.xml");// UpdateXmlNodeValue(doc, "//toolbarwindow[@name]", "goodbye"); UpdateXmlNodeValue(doc, "//selectwindow", "goodbye"); UpdateXmlNodeAttr(doc, "//toolbarwindow/rect[@x]", "x","100"); EndUpdate(doc, "out.xml"); return 0;}
//测试例子[test.xml]
<xml><selectwindow>It is a select object window</selectwindow><toolbarwindow name="toolbar" width="200">It is a toolbar.<rect x="4" y="5"/></toolbarwindow ></xml>
运行结果[out.xml]:
<?xml version="1.0" encoding="UTF-8"?><xml><selectwindow>goodbye</selectwindow><toolbarwindow name="toolbar" width="200">It is a toolbar.<rect x="100" y="5"/></toolbarwindow></xml>
问题:
如果这程序执行这条语句:UpdateXmlNodeValue(doc, "//toolbarwindow[@name]", "goodbye");
结果为:
<?xml version="1.0" encoding="UTF-8"?><xml><selectwindow>goodbye</selectwindow><toolbarwindow name="toolbar" width="200">goodbye</toolbarwindow></xml>
里面的<rect x="4" y="5"/>也被删除了.有兴趣的可以修改这个问题
- 通过libxml2更新XML的属性值和元素值
- 更新XML的属性值和元素值
- 更新XML的属性值和元素值
- LinQ To Xml 通过元素属性检索元素的值
- 通过attr获取元素的属性值
- libxml2 读取xml节点的属性
- XML元素和属性
- xml的标记、元素和属性
- xml属性和子元素的选择
- dom4j 解析元素无属性和有属性的xml文件,都使用反射进行注值
- Myeclipse的xml,鼠标悬停在bean配置上,只有元素和属性提示,没有属性值提示
- 4XML 元素和属性
- XML教程(2)--XML元素与XML属性值
- HTML5之废弃和更新的元素与属性
- 实例034 使用SAX组件解析XML元素属性和属性值
- XML的元素的属性
- XML的标记、元素和属性的简要说明
- XML的属性和子元素的关系
- Change Has Come to America
- 交叉编译jrtplib 问题
- 2012年12月21日 工作总结
- MTK Android 紧急号码修改
- 图像处理与计算机视觉:基础,经典以及最近发展(1)序
- 通过libxml2更新XML的属性值和元素值
- Android 对话框(Dialog)大全
- ubuntu 下软件安装卸载与查看
- vs2010的c++0x支持
- 条件语句if的嵌套使用
- open my eyes
- Eclipse插件入门----HelloWord
- Ubuntu安装配置MySQL
- C++相关链接