XmlDocument.Load Replacing ">"

本文关键字:quot gt Load Replacing XmlDocument | 更新日期: 2023-09-27 17:59:26

运行以下代码时:

 static void Main(string[] args)
    {
        var xmlDoc = new XmlDocument();
        var fileReader = new BinaryReader(File.Open(@"C:'Users'username'Desktop'doc.xlf",FileMode.Open,FileAccess.Read,FileShare.Read));
        var sourceStream = new MemoryStream(fileReader.ReadBytes((int)fileReader.BaseStream.Length));
        xmlDoc.Load(sourceStream);
    }

在具有如下节点的文件上:

<source xml:lang="en-us">
        &lt;b>This text is displayed in Bold.&lt;/b>&lt;br>
        &lt;i>This text is displayed in italics.&lt;/i>
</source>

节点在读取时会转换为以下内容:

<source xml:lang="en-us">
        &lt;b&gt;This text is displayed in Bold.&lt;/b&gt;&lt;br&gt;
        &lt;i&gt;This text is displayed in italics.&lt;/i&gt;
</source>

换句话说,所有>都被&gt; 取代

通常情况下,这是可以的(我甚至认为这在技术上是合法的,即使是糟糕的做法),但在这种情况下,绝对必须在读入节点时不要更改它。对(1)如何读入xml以允许>或(2)如何解决这个问题有什么想法吗?谢谢

XmlDocument.Load Replacing ">"

尽管直角括号在XML中是合法的,但XmlDocument上没有任何选项可以避免将其更改为相应的实体。

您可以使用CDATA部分:

<source xml:lang="en-us">
    <![CDATA[&lt;b>This text is displayed in Bold.&lt;/b>&lt;br>
&lt;i>This text is displayed in italics.&lt;/i>]]>
</source>

在XML中,&gt;>的文本节点值没有差异。因此,XML解析器/DOM可以自由地以任意一种形式表示它认为合适的值。

请注意,XML中还有其他规范化(空白和新行),几乎可以保证保存的XML不会与源XML逐字节相同。

如果您真的需要保持>的完整性,请尝试使用CDATA,即使这样也可以保证文本不会被触摸——一些解析器可能会让您保留>,而不是在保存时转换为&gt;

真正的解决方案是接受这样一个事实,即某些字符将在保存时进行编码(如果使用不直接支持的编码保存,则包括非ASCII字符),以生成有效的XML。