保留回车返回时,我写/读xml文件使用asp.net
本文关键字:文件 xml net asp 返回 回车 我写 保留 | 更新日期: 2023-09-27 18:07:19
我有文本框从用户的评论,评论将被保存到XML文件问题是当我写一个文本有输入键(新行),它将以正确的方式保存到XML中像这样
<comment>
sdagsg
fag
fdhfdhgf
</comment>
但是当我从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: <comment>
sdagsg
fag
fdhfdhgf
</comment>
生成的DOM树:
|- NODE_DOCUMENT #document ""
|- NODE_ELEMENT comment ""
|- NODE_TEXT #text "'n sdagsg'n fag'n fdhfdhgf'n "
所以回车在XML文档中是
当我使用MXXMLWriter
将XML转换回文本时,我得到以下XML片段:
<comment>
sdagsg
fag
fdhfdhgf
</comment>
所以你可以得到原始的XML,所有嵌入的空白和换行符。
您遇到的问题是,您希望将XML显示为HTML。这其中有很多问题。
如果您盲目地尝试在HTML中输出XML:
<P><comment>
sdagsg
fag
fdhfdhgf
</comment></P>
然后什么也没有出现。html解析器不识别<comment>
元素。浏览器被要求不呈现任何它们不能识别的元素。
<
和>
字符,正如您需要做的那样,使用<
和>
:
<P><comment>
sdagsg
fag
fdhfdhgf
</comment></P>
现在在浏览器中呈现,但呈现为:
& lt; comment>/comment>
这样做的原因是浏览器需要将空白(例如,制表符,空格,换行符)折叠成一个空格。
有两种方法可以处理这个问题。首先是将"预格式化"的xml放入一个预格式化的 (PRE
) html元素:
<PRE><comment>
sdagsg
fag
fdhfdhgf
</comment></PRE>
在HTML中给出输出:
<comment>
sdagsg
fag
fdhfdhgf
</comment>
另一种更复杂的解决方案是使用和 HTML,并呈现您希望的HTML。如果你想保持所有的空白(而不是让浏览器折叠它),那么你必须显式地将其转换为不中断的空格字符,通过将"
"替换为" CRLF
":
<P><comment>
sdagsg
fag
fdhfdhgf
</comment></P>
你还必须通过将每个" <BR>
"转换为" CC_11 "来明确地有换行符:
<P><comment><BR>
sdagsg<BR>
fag<BR>
fdhfdhgf<BR>
现在你有了保留空格和回车符的HTML:
& lt; comment>,,,,,,,,,,,,,,,,, sdagsg
,,,,,,,,,,,,,,,,,,同性恋
,,,,,,,,,,,,,,,,,,, fdhfdhgf
,,,,,,,,,,,,,,,,, & lt;/comment>
但是XSL能做到吗?
我不知道。
XSL可能是一种NP图灵完备语言,但我不知道它是否可以:
String html = DocumentToString(xmlDocument);
html = StringReplace(html, "<", "<");
html = StringReplace(html, ">", ">");
html = StringReplace(html, " ", " ");
html = StringReplace(html, "'r'n", "<BR>");
这一转换:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="text()" name="replaceNL">
<xsl:param name="pText" select="."/>
<xsl:choose>
<xsl:when test="not(contains($pText, ' '))">
<xsl:copy-of select="$pText"/>
</xsl:when>
<xsl:otherwise>
<xsl:copy-of select="substring-before($pText, ' ')"/>
<br />
<xsl:call-template name="replaceNL">
<xsl:with-param name="pText" select=
"substring-after($pText, ' ')"/>
</xsl:call-template>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
当应用于提供的XML文档时:
<comment>
sdagsg
fag
fdhfdhgf
</comment>
生成具有所需属性的HTML结果:
<br/> sdagsg<br/> fag<br/> fdhfdhgf<br/>
在浏览器中显示为:
sdagsg
fag
fdhfdhgf
,如果您想保留空格,可以通过稍微修改上面的转换:
来实现。<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="text()" name="replaceNL">
<xsl:param name="pText" select=
"translate(., ' ', ' ')"/>
<xsl:choose>
<xsl:when test="not(contains($pText, ' '))">
<xsl:copy-of select="$pText"/>
</xsl:when>
<xsl:otherwise>
<xsl:copy-of select="substring-before($pText, ' ')"/>
<br />
<xsl:call-template name="replaceNL">
<xsl:with-param name="pText" select=
"substring-after($pText, ' ')"/>
</xsl:call-template>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
结果现在每个空格字符都被一个不换行的空格替换,并且在浏览器中显示为:
sdagsg
苦工
fdhfdhgf
我终于找到了解决办法解决方案是在生成HTML后将XML空间替换为HTML空间。
strHtml = strHtml.Replace("<br/>", "<br/>");