输出格式化的xml文件

输出格式化的xml文件

上一篇我按照网上的资源写了一个创建xml文件的小程序,算让创建成功,但是在新增节点时发现格式不对,没有成xml的树状而是一行,详见我在简书的 创建xml文件系统 http://www.jianshu.com/p/36cc32096ac9
经过分析和查阅资料简单的来说是xmlParseFilexmlReadFile的问题,两个函数都可以实现,只是实现方法有些不同。下面简单的说下两者的区别

xmlParseFile

我之前使用的就是xmlParseFile,它的功能是


Function: xmlParseFile
xmlDocPtr   xmlParseFile        (const char * filename)
parse an XML file and build a tree. Automatic support for ZLIB/Compress compressed document is provided by default if found at compile-time。

filename:   the filename
Returns:    the resulting document tree if the file was wellformed, NULL otherwise.


xmlParseFile是按默认的方式加载xml文件。需要注意的是如果要使用xmlParseFile加载文件,并修改保存话需要

xmlKeepBlanksDefault(0) ;
xmlIndentTreeOutput = 1 ;

xmlKeepBlanksDefault

Set and return the previous value for default blanks text nodes support. The 1.x version of the parser used an heuristic to try to detect ignorable white spaces. As a result the SAX callback was generating xmlSAX2IgnorableWhitespace() callbacks instead of characters() one, and when using the DOM output text nodes containing those blanks were not generated. The 2.x and later version will switch to the XML standard way and ignorableWhitespace() are only generated when running the parser in validating mode and when the current element doesn't allow CDATA or mixed content. This function is provided as a way to force the standard behavior on 1.X libs and to switch back to the old mode for compatibility when running 1.X client code on 2.X . Upgrade of 1.X code should be done by using xmlIsBlankNode() commodity function to detect the "empty" nodes generated. This value also affect autogeneration of indentation when saving code if blanks sections are kept, indentation is not generated.
val: int 0 or 1
Returns: the last value for 0 for no substitution, 1 for substitution.
--http://xmlsoft.org/

根据上面的话当2.x版本时要设成1.

xmlIndentTreeOutput

Note that format = 1 provide node indenting only if xmlIndentTreeOutput = 1

xmlReadFile

xmlReadFile不仅可以加载文件还可以加载URL。


Function: xmlReadFile
xmlDocPtr   xmlReadFile(const char * filename,  const char * encoding, int options)
parse an XML file from the filesystem or the network.

filename:   a file or URL
encoding:   the document encoding, or NULL
options:    a combination of xmlParserOption
Returns:    the resulting document tree

使用xmlReadFile就不用做其他的处理,例如这次的小程序直接修改

//doc = xmlParseFile(osd_block_file);
doc = xmlReadFile(osd_block_file, NULL, XML_PARSE_NOBLANKS);

就可以格式化输出了。

运行结果


上面的两种方法都可以实现格式化输出的功能,输出的xml文件如下

<?xml version="1.0" encoding="UTF-8"?>
<osd_block>
  <osd num="1">
    <str>初始化中</str>
    <size>4</size>
    <color>1</color>
    <x>50</x>
    <y>50</y>
  </osd>
  <osd num="1">
    <str>初始化中</str>
    <size>4</size>
    <color>1</color>
    <x>50</x>
    <y>50</y>
  </osd>
</osd_block>

比较

虽然xmlParseFile和xmlReadFile都可以使用,但是建议还是要是用xmlReadFile
在这[LINK]可以看下libxml2的作者是如何说的

"Use xmlReadFile, it's the modern API for parsing"

而且
xmlReadFile比xmlParseFile更强大,xmlReadFile第三个参数提供了强大的选项

Enum xmlParserOption { XML_PARSE_RECOVER = 1 : recover on errors 
XML_PARSE_NOENT = 2 : substitute entities 
XML_PARSE_DTDLOAD = 4 : load the external subset 
XML_PARSE_DTDATTR = 8 : default DTD attributes 
XML_PARSE_DTDVALID = 16 : validate with the DTD 
XML_PARSE_NOERROR = 32 : suppress error reports 
XML_PARSE_NOWARNING = 64 : suppress warning reports 
XML_PARSE_PEDANTIC = 128 : pedantic error reporting 
XML_PARSE_NOBLANKS = 256 : remove blank nodes 
XML_PARSE_SAX1 = 512 : use the SAX1 interface internally 
XML_PARSE_XINCLUDE = 1024 : Implement XInclude substitition 
XML_PARSE_NONET = 2048 : Forbid network access 
XML_PARSE_NODICT = 4096 : Do not reuse the context dictionary 
XML_PARSE_NSCLEAN = 8192 : remove redundant namespaces declarations 
XML_PARSE_NOCDATA = 16384 : merge CDATA as text nodes 
XML_PARSE_NOXINCNODE = 32768 : do not generate 
XINCLUDE START/END nodes 
XML_PARSE_COMPACT = 65536 : compact small text nodes; no modification of the tree allowed afterwards (will possibly crash if you try to modify the tree) 
XML_PARSE_OLD10 = 131072 : parse using
XML-1.0 before update 5 
XML_PARSE_NOBASEFIX = 262144 : do not fixup XINCLUDE xml:base uris 
XML_PARSE_HUGE = 524288 : relax any hardcoded limit from the parser 
XML_PARSE_OLDSAX = 1048576 : parse using SAX2 interface before 2.7.0 
XML_PARSE_IGNORE_ENC = 2097152 : ignore internal document encoding hint XML_PARSE_BIG_LINES = 4194304 : Store big lines numbers in text PSVI field}

下一篇将尝试解析和修改。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,332评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,508评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,812评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,607评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,728评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,919评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,071评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,802评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,256评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,576评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,712评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,389评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,032评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,798评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,026评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,473评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,606评论 2 350

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,637评论 18 139
  • 我该如何用一行去描述未完的遗憾? 如此,这般?
    化浊阅读 288评论 0 0
  • 阿厘分享,缺乏行动力的天赋才华落地,需要认可 信念没有用: 刚在毕业群,分享我马上要去落地天赋去别的地方做活动,我...
    Ali阿厘阅读 423评论 0 1
  • 写完这个标题发觉太大了点,现在开个公众号,不叫自媒体,叫内容创业。概念更迭太快,离开北上广的人有点快跟不上。 这一...
    杨夏阅读 297评论 0 3
  • 这几年断断续续练过几年瑜伽,今年重新开始跟着老师训练,发现练了一段时间没什么进步,往后跳重得像秤砣,也没找到所谓腹...
    落落的萝卜糕阅读 501评论 0 1