使用XmlDocument转义换行符

5
我的应用程序使用XmlDocument生成XML。其中一些数据包含换行符和回车符。
当将文本分配给XmlElement时,如下所示:
   e.InnerText = "Hello\nThere";

生成的XML如下所示:
<e>Hello
There</e>

接收XML的程序(我无法控制)将换行符视为空格,因此将上述文本视为:
 "Hello There"

如果接收方想要保留换行符,需要使用以下编码:

<e>Hello&#xA;There</e>

如果数据应用到XmlAttribute,换行符会被正确编码。
我尝试使用InnerText和InnerXml将文本应用于XmlElement,但两者的输出结果相同。
是否有办法使XmlElement文本节点以它们的编码形式输出换行符和回车符号?
以下是一些演示问题的示例代码:
string s = "return[\r] newline[\n] special[&<>\"']";
XmlDocument d = new XmlDocument();
d.AppendChild( d.CreateXmlDeclaration( "1.0", null, null ) );
XmlElement  r = d.CreateElement( "root" );
d.AppendChild( r );
XmlElement  e = d.CreateElement( "normal" );
r.AppendChild( e );
XmlAttribute a = d.CreateAttribute( "attribute" );
e.Attributes.Append( a );
a.Value = s;
e.InnerText = s;
s = s
    .Replace( "&" , "&amp;"  )
    .Replace( "<" , "&lt;"   )
    .Replace( ">" , "&gt;"   )
    .Replace( "\"", "&quot;" )
    .Replace( "'" , "&apos;" )
    .Replace( "\r", "&#xD;"  )
    .Replace( "\n", "&#xA;"  )
;
e = d.CreateElement( "encoded" );
r.AppendChild( e );
a = d.CreateAttribute( "attribute" );
e.Attributes.Append( a );
a.InnerXml = s;
e.InnerXml = s;
d.Save( @"C:\Temp\XmlNewLineHandling.xml" );

这个程序的输出是:
<?xml version="1.0"?>
<root>
  <normal attribute="return[&#xD;] newline[&#xA;] special[&amp;&lt;&gt;&quot;']">return[
] newline[
] special[&amp;&lt;&gt;"']</normal>
  <encoded attribute="return[&#xD;] newline[&#xA;] special[&amp;&lt;&gt;&quot;']">return[
] newline[
] special[&amp;&lt;&gt;"']</encoded>
</root>

事先感谢您的帮助。 Chris。


你想要什么并不清楚。请展示你想要的内容以及你得到了什么。 - TFD
看一下前四行代码:我从哪里开始,我得到了什么,接收者看到了什么,我想要的是什么。属性以我想要的方式编码换行符,元素则不行。 - Chris C.
4个回答

1

使用HttpUtility.HtmlEncode()怎么样?
http://msdn.microsoft.com/en-us/library/73z22y6h.aspx

好的,抱歉之前给你带来了错误的引导。 HttpUtility.HtmlEncode()无法解决你面临的换行问题。

不过这篇博客链接会帮助你解决问题
http://weblogs.asp.net/mschwarz/archive/2004/02/16/73675.aspx

基本上,换行处理由xml:space="preserve"属性控制。

以下是示例工作代码:

XmlDocument doc = new XmlDocument();
doc.LoadXml("<ROOT/>");
doc.DocumentElement.InnerText = "1234\r\n5678";

XmlAttribute e = doc.CreateAttribute(
    "xml", 
    "space", 
    "http://www.w3.org/XML/1998/namespace");
e.Value = "preserve";
doc.DocumentElement.Attributes.Append(e);

var child = doc.CreateElement("CHILD");
child.InnerText = "1234\r\n5678";
doc.DocumentElement.AppendChild(child);

Console.WriteLine(doc.InnerXml);
Console.ReadLine();

输出将会是:

<ROOT xml:space="preserve">1234
5678<CHILD>1234
5678</CHILD></ROOT>

我已经测试过了,我的接收器无法识别或处理xml:space属性。换行符必须编码为 ,否则它们会被转换为空格。 - Chris C.

0

在 .net 2.0 中使用 XmlDocument PreserveWhitespace 开关

XmlDocument d = new XmlDocument();
d.PreserveWhitespace = true;

1
当我尝试这样做时,它对换行符的编码没有影响。 - Chris C.

0

0

在我上面的示例代码中,有一个简单的编码器。问题是如何让 XmlElement 保留已编码的字符。它会将它们转换回换行符和回车符。 - Chris C.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接