保留回车返回时,我写/读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文件使用asp.net

读取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>元素。浏览器被要求不呈现任何它们不能识别的元素。

第一个可能尝试的修复是转义<>字符,正如您需要做的那样,使用&lt;&gt;:
<P>&lt;comment&gt;
              sdagsg
               fag
                fdhfdhgf
              &lt;/comment&gt;</P>

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

& lt; comment>/comment>

这样做的原因是浏览器需要将空白(例如,制表符,空格,换行符)折叠成一个空格。

有两种方法可以处理这个问题。首先是将"预格式化"的xml放入一个预格式化的 (PRE) html元素:

<PRE>&lt;comment&gt;
                  sdagsg
                   fag
                    fdhfdhgf
                  &lt;/comment&gt;</PRE>

在HTML中给出输出:

<comment>
                  sdagsg
                   fag
                    fdhfdhgf
                  </comment>
另一种更复杂的解决方案是使用 HTML,并呈现您希望的HTML。如果你想保持所有的空白(而不是让浏览器折叠它),那么你必须显式地将其转换为不中断的空格字符,通过将""替换为" CRLF ":
<P>&lt;comment&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sdagsg
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fag
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fdhfdhgf
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/comment&gt;</P>

你还必须通过将每个" <BR> "转换为" CC_11 "来明确地有换行符:

<P>&lt;comment&gt;<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sdagsg<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fag<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fdhfdhgf<BR>

现在你有了保留空格和回车符的HTML:


& lt; comment>,,,,,,,,,,,,,,,,, sdagsg
,,,,,,,,,,,,,,,,,,同性恋
,,,,,,,,,,,,,,,,,,, fdhfdhgf
,,,,,,,,,,,,,,,,, & lt;/comment>


但是XSL能做到吗?

我不知道。

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

String html = DocumentToString(xmlDocument);
html = StringReplace(html, "<", "&lt;");
html = StringReplace(html, ">", "&gt;");
html = StringReplace(html, " ", "&nbsp;");
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, '&#10;'))">
            <xsl:copy-of select="$pText"/>
           </xsl:when>
           <xsl:otherwise>
             <xsl:copy-of select="substring-before($pText, '&#10;')"/>
             <br />
             <xsl:call-template name="replaceNL">
               <xsl:with-param name="pText" select=
                "substring-after($pText, '&#10;')"/>
             </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(., ' ', '&#160;')"/>
         <xsl:choose>
           <xsl:when test="not(contains($pText, '&#10;'))">
            <xsl:copy-of select="$pText"/>
           </xsl:when>
           <xsl:otherwise>
             <xsl:copy-of select="substring-before($pText, '&#10;')"/>
             <br />
             <xsl:call-template name="replaceNL">
               <xsl:with-param name="pText" select=
                "substring-after($pText, '&#10;')"/>
             </xsl:call-template>
           </xsl:otherwise>
         </xsl:choose>
 </xsl:template>
</xsl:stylesheet>

结果现在每个空格字符都被一个不换行的空格替换,并且在浏览器中显示为:


sdagsg
苦工
fdhfdhgf

我终于找到了解决办法解决方案是在生成HTML后将XML空间替换为HTML空间。

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