使用asp.net从xml文件写入/读取时保留回车

我有TextBox来接受用户的评论,评论会被保存到XML文件中,问题是我写文字时输入密钥(新行)它会以正确的方式保存到xml中这样

 sdagsg fag fdhfdhgf  

但是当我从xml中读取时看起来像这样的“sdagsg fag fdhfdhgf”

  string strXstFile = Server.MapPath(@"~/TopicAndComments.xsl"); XslCompiledTransform x = new XslCompiledTransform(); // Load the XML XPathDocument doc = new XPathDocument(Server.MapPath(@"~/TopicAndComments.xml")); // Load the style sheet. XslCompiledTransform xslt = new XslCompiledTransform(); xslt.Load(strXstFile); MemoryStream ms = new MemoryStream(); XmlTextWriter writer = new XmlTextWriter(ms, Encoding.ASCII); StreamReader rd = new StreamReader(ms); //Pass Topic ID to XSL file XsltArgumentList xslArg = new XsltArgumentList(); xslArg.AddParam("TopicID", "", HiddenField_SelectedTopicID.Value.ToString()); xslt.Transform(doc, xslArg, writer); ms.Position = 0; strHtml = rd.ReadToEnd(); rd.Close(); ms.Close(); 

读取XML文件没有任何问题。 XML对空白区域不敏感。

如果您希望XML中的某些部分不遵循所有XML规则并且有点特殊,那么您可以使用所谓的CDATA部分。 这是您在“保存”用户数据时应该使用的内容。

请参阅如何在C#中执行此操作的一种方法。 编写XML的方式可能有不同的等价物:
http://msdn.microsoft.com/en-us/library/system.xml.xmldocument.createcdatasection.aspx

我认为我同意Davide Piras对这个问题的评论。 我认为你遇到了与使用XmlDocument转义换行符相同的问题,因此从那里选择了我最喜欢的答案。

解析xml时,它会提供以下DOM树:

原始xml:

   sdagsg fag fdhfdhgf  

生成的DOM树:

 |- NODE_DOCUMENT #document "" |- NODE_ELEMENT comment "" |- NODE_TEXT #text "\n sdagsg\n fag\n fdhfdhgf\n " 

因此回车符在XML文档中。

当我使用MXXMLWriter将XML转换回文本时,我得到以下XML片段:

  sdagsg fag fdhfdhgf  

因此,您可以获得原始XML,包含所有嵌入的空格和换行符。

您遇到的问题是您希望将XML显示为HTML。 这有很多问题。

如果你盲目地尝试在HTML中输出XML:

 

sdagsg fag fdhfdhgf

然后没有出现。 html解析器无法识别元素。 浏览器不需要渲染任何他们无法识别的元素。

可能尝试的第一个修复是, 正如您所要做的那样 ,使用<转义<>字符<>

 

<comment> sdagsg fag fdhfdhgf </comment>

这现在在浏览器中呈现,但呈现为:

sdagsg fag fdhfdhgf

原因是浏览器需要将空格(例如,制表符,空格,换行符)折叠到单个空格中。

有两种方法可以解决这个问题。 首先是将“预格式化”的xml放入预先格式化的PRE )html元素中:

 
<comment> sdagsg fag fdhfdhgf </comment>

这给出了HTML输出:

  sdagsg fag fdhfdhgf  

另一个更复杂的解决方案是使用 HTML,并呈现您想要的HTML。 如果你想维护所有空格(而不是让浏览器将其折叠),那么你必须将它明确地转换为不间断的空格字符,方法是替换“ “有”   “:

 

<comment>                   sdagsg                    fag                     fdhfdhgf                   </comment>

而且你还必须通过将每个“ CRLF ”转换为“
”来明确地设置换行符:

 

<comment>
                  sdagsg
                   fag
                    fdhfdhgf

现在你有了HTML来保存你的空格和回车:

<评论>
sdagsg
FAG
fdhfdhgf


但是XSL能做到吗?

我不知道。

XSL可能是NP图灵完备语言,但我不知道它是否可以:

 String html = DocumentToString(xmlDocument); html = StringReplace(html, "<", "<"); html = StringReplace(html, ">", ">"); html = StringReplace(html, " ", " "); html = StringReplace(html, "\r\n", "
");

这种转变

            

当应用于提供的XML文档时

  sdagsg fag fdhfdhgf  

生成包含所需属性的HTML结果

 
sdagsg
fag
fdhfdhgf

它在浏览器中显示为

sdagsg
FAG
fdhfdhgf

如果你想保留甚至空白,可以通过略微修改上述转换来完成

            

结果现在将每个空格字符替换为不间断的空格,并在浏览器中显示为

sdagsg
FAG
fdhfdhgf

最后我发现解决方案的解决方案是在生成html之后将xml空间替换为html空间我添加此项

  strHtml = strHtml.Replace("<br/>", "
");

在关闭流阅读器之前的方法结束时