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

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

Mic*_*Liu 3

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

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

该选项的目的是保留 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 是一个非缓存的、只进的写入器,所以答案是,直到它实际遇到字符数据时才会这样做。此时,它会切换到“混合内容”模式并禁止格式化。不幸的是,撤消已写入底层流的子节点的格式为时已晚。