XmlDocument混合内容漂亮打印行为背后的基本原理是什么?

时间:2015-03-10 15:16:51

标签: .net xml pretty-print

使用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会那样工作?

1 个答案:

答案 0 :(得分:3)

这种行为很不幸,但我认为可以通过XmlTextWriter的Formatting.Indented选项(这是XmlDocument.Save在这里使用的)的描述来解释:

  

根据IndentationIndentChar设置缩放子元素。   此选项仅缩进元素内容; 混合内容不受影响。

此选项的目的是保留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;模式并禁止格式化。不幸的是,撤消已经写入底层流的子节点的格式化为时已晚。