好久没上来留下一些记录了,可能是太忙,又或者是过于慵懒便疏于整理。
libxml是一个开源的库,linux下解析xml文件经常用到,进行一些创读增删的操作。
最开始接触的时候,看到了一个简明易懂的《Libxml 简单教程》,看完之后直接就可以实现大多数常用的xml管理工作。
但是在功能实现之后,发现保存后的文档不大美观,创建的所有节点会挤到同一行,不便于阅读。
在这里,我所知道的暂时有两种方法来处理这个换行问题。
原始xml如下:
1 <?xml version="1.0" encoding="UTF-8"?> 2 <root> 3 <newNode1>newNode1 content</newNode1> 4 <newNode2>newNode2 content</newNode2> 5 <newNode3>newNode3 content</newNode3> 6 <node2 attribute="yes"></node2> 7 <son> 8 <grandson>grandson content</grandson> 9 <grandson2>This is a grandson2 node</grandson2> 10 <node2 attribute="no"></node2> 11 <node3 attribute="1123"> 12 <node1> 13 <node2 attribute="nothing"></node2> 14 </node1> 15 </node3> 16 </son> 17 </root>
方法一:
读取xml采用去除空白的模式,在最后保存时让libxml自动补充空白。
doc = xmlReadFile(docname, "UTF-8", XML_PARSE_NOBLANKS); // 此处可加入xml增删修改处理... nRel = xmlSaveFormatFileEnc(docname, doc, "UTF-8", 1);
这种方法是最简单的,若原来功能已经做好了,只需要修改很少代码就可以达到效果;而且此方法大多数情况下都是有效可行的。
方法二:
插入新节点时,在后面多插入一个Text节点,内容带换行字符"\n";若当前节点没有文本内容,可以设Content内容,同样带"\n"。
node1 = xmlNewNode(NULL,BAD_CAST"DataNode"); node2 = xmlNewText(BAD_CAST "\n "); // 此处node1可加入额外属性设置代码... xmlAddChild(node, node1); xmlNodeSetContent(node1, BAD_CAST "\n "); xmlAddNextSibling(node1, node2);
方法一无法达到效果,或不能使用NOBLANKS模式,也可以尝试用此方法二;本方法是一定可行的,只是控制上稍微麻烦一些。
附上测试效果:
1 <?xml version="1.0" encoding="UTF-8"?> 2 <root> 3 <newNode1>newNode1 content</newNode1> 4 <newNode2>newNode2 content</newNode2> 5 <newNode3>newNode3 content</newNode3> 6 <node2 attribute="yes"> 7 <DataNode Ref="IIIIIIIIIIIIIIIIII" Name="JJJJJJJJJJJJJJJJJ">30</DataNode> 8 </node2> 9 <son> 10 <grandson>grandson content</grandson> 11 <grandson2>This is a grandson2 node</grandson2> 12 <node2 attribute="no"> 13 <DataNode Ref="IIIIIIIIIIIIIIIIII" Name="JJJJJJJJJJJJJJJJJ">30</DataNode> 14 </node2> 15 <node3 attribute="1123"> 16 <node1> 17 <node2 attribute="nothing"> 18 <DataNode Ref="IIIIIIIIIIIIIIIIII" Name="JJJJJJJJJJJJJJJJJ">30</DataNode> 19 </node2> 20 </node1> 21 </node3> 22 </son> 23 </root>
最后附上下载地址:
2. 方法一的测试源代码下载
时间: 2024-10-07 22:47:12