2

运行以下代码时:

 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)如何解决这个问题?谢谢!

4

2 回答 2

6

尽管右尖括号在 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>
于 2013-02-14T16:23:55.483 回答
2

&gt;文本节点之间和>文本节点的值之间的 XML 没有区别。因此,XML 解析器/DOM 可以自由地以它认为合适的任何一种形式来表示值。

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

如果您确实需要保持>完整,请尝试使用 CDATA,即使这样也可以保证不会触及文本 - 某些解析器可能会让您保留>而不是转换为&gt;保存时。

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

于 2013-02-14T16:42:44.177 回答