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