我的应用程序使用XmlDocument生成XML。某些数据包含换行符和回车符。
将文本分配给XmlElement时,如下所示:
e.InnerText = "Hello\nThere";
生成的XML如下所示:
<e>Hello
There</e>
XML的接收者(我无法控制)将新行视为空格,并将上述文本视为:
"Hello There"
要使接收器保留换行符,它需要编码为:
<e>Hello
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( "&" , "&" )
.Replace( "<" , "<" )
.Replace( ">" , ">" )
.Replace( "\"", """ )
.Replace( "'" , "'" )
.Replace( "\r", "
" )
.Replace( "\n", "
" )
;
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[
] newline[
] special[&<>"']">return[
] newline[
] special[&<>"']</normal>
<encoded attribute="return[
] newline[
] special[&<>"']">return[
] newline[
] special[&<>"']</encoded>
</root>
提前致谢。 克里斯。
答案 0 :(得分: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>
答案 1 :(得分:0)
使用methods described here编码可能是您最好的选择。或许您可以考虑使用CData section代替您的内容。
答案 2 :(得分:0)
在.net 2.0中使用XmlDocument PreserveWhitespace开关
XmlDocument d = new XmlDocument();
d.PreserveWhitespace = true;
答案 3 :(得分:0)
解决方案是在生成html后将xml空间替换为html空间 我添加这个
strHtml = strHtml.Replace("<br/>", "<br/>");
关闭流阅读器之前在方法结束时