Xml解析好奇心 – 属性中的“大于”

我有一些看起来像这样的xml:

 '/> 

这被我试过的解析器接受为格式良好的xml, RFC的相关部分也暗示这是有效的,虽然我个人不相信它直到我检查(有趣的是这不会如果它是一个开口的三角形支撑,则它是有效的,但它是一个闭合支撑)。

我有一些用于“漂亮打印”xml的代码 – 它应该只改变行长和新行 – 它不应该改变任何内容。 但是,无论我如何尝试解析这个xml,它总是被实体替换:

  

这并非完全出乎意料,任何xml解析器都应该将两者视为相同,但出于我的目的,我不希望出现这种行为,因为这是仅用于更改xml文件格式的代码,而不是其内容。

如果我将xml加载到XmlDocument中并不重要:

 var xml = " '/>"; var doc = new XmlDocument(); doc.LoadXml(xml); Console.WriteLine(doc.OuterXml); 

或者XElement:

 var xElement = XElement.Parse(xml); xElement.Save(Console.Out); 

或通过读写器对传递:

 using (var ms = new MemoryStream()) using (var streamWriter = new StreamWriter(ms)) { streamWriter.Write(xml); streamWriter.Flush(); ms.Position = 0; using (var xmlReader = XmlReader.Create(ms)) { xmlReader.Read(); Console.WriteLine(xmlReader.ReadOuterXml()); } } 

它们都用>替换>实体> ,事件虽然前者是可以接受的格式良好的xml。 我尝试过使用各种XmlReaderSettings或XElement的LoadOptions等,但都无济于事。

有谁知道有任何方法可以防止这种情况发生?

这更像是一个好奇而不是实际问题,但我很想知道是否有人有任何解决方案。

[ 编辑澄清,根据一些意见/答案 ]

我确实意识到这种行为是可以预期的。 在我的情况下,也许我根本不想使用其中一个内置的xml API(尽管我使用的任何东西都需要理解xml的结构,以免在不适当的地方换行,它改变了语义的含义。文献。)

我真的只是想知道是否有人知道改变这些解析器中的行为的方法(我希望你能想到,如果有人知道,他们可能会在SO上),或者如果有人有任何其他想法。

我的猜测是你会发现没有办法改变这种情况 – 因为我强烈怀疑加载后的内部表示是否相同无论是最初的还是>

有趣的是, xr.GetAttribute("attribute")会像您期望的那样返回" > " 。 我的猜测是,在ReadOuterXml创建XML时,它编码所有> as > 。 因此,为了解决这个问题,您可以在发生每个节点时对其进行处理。