XmlDocument.Load替换“>”

时间:2013-02-14 16:22:08

标签: c# xml

运行以下代码时:

 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)如何解决此问题的任何想法?谢谢!

2 个答案:

答案 0 :(得分: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>

答案 1 :(得分:2)

文本节点值中&gt;>之间的XML没有区别。因此,XML解析器/ DOM可以自由地以任何形式表示值。

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

如果您真的需要保持>完整使用CDATA,即使这样也可以保证不会触及文字 - 有些解析器可能会让您保留>而不是转换为&gt;在保存。

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