libxml两种换行方法

好久没上来留下一些记录了,可能是太忙,又或者是过于慵懒便疏于整理。

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>

  

最后附上下载地址:

1. 《Libxml 简单教程》下载

2. 方法一的测试源代码下载

 

posted @ 2014-12-26 11:30  yison.li  阅读(1824)  评论(1编辑  收藏  举报