使用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 comment>
原因是浏览器需要将空格(例如,制表符,空格,换行符)折叠到单个空格中。
有两种方法可以解决这个问题。 首先是将“预格式化”的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/>", "
");
在关闭流阅读器之前的方法结束时