Xml解析好奇心-“大于”在属性

本文关键字:大于 属性 好奇心 Xml | 更新日期: 2023-09-27 17:50:17

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

<rootElement attribute=' > '/>

这被我尝试过的解析器接受为格式良好的xml, RFC的相关部分也表明这是有效的,尽管我个人不相信它是有效的,直到我检查(有趣的是,如果它是一个开始三角括号,这将是无效的,但它是作为一个结束大括号)。

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

<rootElement attribute=' &gt; '/>

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

无论我是否将xml加载到XmlDocument中:

var xml = "<rootElement attribute=' > '/>";
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());
    }
}

它们都将>实体替换为&gt;事件,尽管前者是可接受的格式良好的xml。我试过玩各种XmlReaderSettings,或XElement的LoadOptions等,但都无济于事。

有人知道有什么方法可以防止这种情况吗?

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

[编辑澄清,根据一些评论/答案]

我真的意识到这种行为是预料之中的。在我的例子中,也许我根本不想使用内建的xml api之一(尽管我使用的任何api都需要理解xml的结构,以免在不适当的地方换行,从而改变文档的语义。)

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

Xml解析好奇心-“大于”在属性

我的猜测是你会发现没有办法改变这一点-因为我强烈怀疑加载后的内部表示将是相同的,无论它最初是>还是&gt;

有趣的是,xr.GetAttribute("attribute")如您所期望的那样返回" > "。我的猜测是,在ReadOuterXml中创建XML时,它将所有>编码为&gt;。因此,为了解决这个问题,您应该在每个节点发生时处理它,以便美观地打印它。