zeu*_*xcg 5 .net xml pretty-print
当漂亮地打印混合内容节点时,.NET XmlDocument有一个有趣的行为XmlDocument.Save(TextWriter).
行为可以概括为"一旦漂亮的打印机遇到文本节点,它就会禁用当前子树的其余部分的缩进和自动换行".
这是一个例子(http://ideone.com/b1WxD7):
<?xml version='1.0'?>
<root><test><child1/><child2/>foo<child3><child4/></child3></test></root>
Run Code Online (Sandbox Code Playgroud)
非常印刷
<?xml version="1.0"?>
<root>
<test>
<child1 />
<child2 />foo<child3><child4 /></child3></test>
</root>
Run Code Online (Sandbox Code Playgroud)
这种行为似乎不正确也不直观.为什么XmlDocument会那样工作?
这种行为很不幸,但我认为可以通过XmlTextWriter 的Formatting.Indented选项的描述来解释(这就是 XmlDocument.Save 在这里使用的):
使子元素根据Indentation和IndentChar设置缩进。该选项仅缩进元素内容;混合内容不受影响。
该选项的目的是保留 XML 的格式,例如
<p>Here is some <b>bold</b> text.</p>
Run Code Online (Sandbox Code Playgroud)
并且没有将其重新格式化为
<p>
Here is some
<b>
bold
</b>
text.
</p>
Run Code Online (Sandbox Code Playgroud)
但有一个问题:XmlTextWriter 如何知道元素包含混合内容?因为 XmlTextWriter 是一个非缓存的、只进的写入器,所以答案是,直到它实际遇到字符数据时才会这样做。此时,它会切换到“混合内容”模式并禁止格式化。不幸的是,撤消已写入底层流的子节点的格式为时已晚。