在XML中保留特殊字符

6

我在数据库表中存储了一个带有换行符的xml字符串。

在我的C# 3.5程序中,我使用Linq to xml加载和操作它,然后将其作为字符串显示在UI表单上的文本框控件中。

我需要在显示时缩进这个xml,并保留换行符/回车符。

我能够缩进它,但如何保留xml中的LF/CR字符?

以下是示例C#代码:

    XElement rootNode = CreateRootNode();
    XElement testXmlNode = XElement.Parse(xmlFromDbWithLFChars);

    rootNode.Add(testXmlNode );

    var builder = new StringBuilder();
    var settings = new XmlWriterSettings()
    {
     Indent = true
    };

    using (var writer = XmlWriter.Create(builder, settings))
    {
     rootNode.WriteTo(writer);
    }
    xmlString  = builder.ToString();   

    xmlString = xmlString.Replace("
", Environment.NewLine); //Doesnt work

    xmlString = xmlString.Replace("
", Environment.NewLine);  //Doesnt work

//Heres how the xml should look like in the UI control:
 <TestNode
             name="xyz"
             Id="12">
             <Children>
                  <Child name="abc" location="p" />
             </Children>
    </TestNode>

你的意思是保留XML中的换行符,使其在用户界面中表现为换行符? - BeemerGuy
还有一个问题:当你说“//不起作用”时,你是指它显示两个换行符还是根本没有显示? - BeemerGuy
Beemer,在UI中不显示XML中的任何新行。 - user40907
你能举个例子吗?比如说,xmlFromDbWithLFChars 变量中包含了什么输入值? - Nayan
+5?这个问题很混乱。它似乎与C#或XML没有太多关系,而更多地涉及UI控件。 - annakata
5个回答

3
您需要做的是在XmlWriter上设置格式设置,因此更改您的行:
var settings = new XmlWriterSettings() 
    { 
     Indent = true 
    }; 

转化为如下格式:

var settings = new XmlWriterSettings() 
    { 
     Indent = true,
     IndentChars = "\n",
     NewLineOnAttributes = true
    }; 

谢谢Almund!我在原始方法中唯一遗漏的是使用“NewLineOnAttributes = true”,这似乎非常有效! - user40907
很容易被忽略,很高兴它有帮助! - Almund

1
感谢大家的回复。最终,我成功地解决了这个问题。
我的方法不使用Linq2Xml/SAX解析器。我使用StringBuilder生成XML,并在WinForms Rich文本框控件中显示它。现在,我可以在UI中看到换行符。

你应该将你使用的解决方案作为答案添加。 - Mauro
生成XML应该使用StringBuilder吗?绝对不可能。XML不是字符串数据,试图像使用正则表达式解析或使用StringBuilder组装字符串一样处理它缺乏严谨性,在维护方面容易出错,并极易受到人为错误的影响。 - annakata
Annakata,你说的是对的,但不幸的是,我无法向业务方提供相同的理由...因为我不想采用 StringBuilder 方法,因为我知道那会是脆弱的代码,所以我首先尝试了 Linq2API、SAX 和 DOM 解析器,但无法得到所需的格式化输出。谢谢。 - user40907

0

任何时候,当您将XML文档转换为字符串并开始操作该字符串时,您应该想到自己,“自己,我在做错了什么。”我不确定从您的描述中是否正确,但我敢打赌是这样的。

如果您从数据库中提取的XML中的空格很重要,则在将其解析为XElement时要保留它。为此,请使用执行此操作的XElement.Parse的重载,例如:

XElement testXmlNode = XElement.Parse(xmlFromDbWithLFChars, LoadOptions.PreserveWhitespace);

当您这样做时,解析器将在解析的XElement文档的文本节点中保留空格字符,就像它们在原始字符串中一样。 XmlWriter不会干扰文本节点中现有的空格(尽管如果您告诉它缩进,它会添加新的空格),因此这应该可以满足您的需求。

1
当你说“textarea”时,你是指HTML的TEXTAREA吗?因为在TEXTAREA元素中,换行由CR / LF对表示。如果XML文本中只有LF字符,则它们不会呈现为TEXTAREA中的换行符。 - Robert Rossney
我想说的是,在文本框中看不到换行符并不意味着它们在XML中不存在。如果您只是向UI发送像this\nis\na\ntest这样的字符串,它会显示换行符吗? - Robert Rossney
我之前尝试过那个......不,它没有在文本框中显示换行符.....谢谢。 - user40907
1
那么这个问题与 XML 没有任何关系,是吗? - Robert Rossney
1
这是一个愚蠢的问题,但文本框是否启用了多行?它是否接受回车符? - Mauro
显示剩余2条评论

0

您可以使用XmlReader来保留换行符和其他内容。以下是一个示例代码,当我测试时它运行良好:

System.Xml.XmlReader reader = System.Xml.XmlReader.Create("XML URI here");
System.Text.StringBuilder sb = new System.Text.StringBuilder();
while (reader.Read())
{
    sb.Append(reader.ReadOuterXml());
}
reader.Close();
txtXML.InnerText = sb.ToString();
txtXML.Visible = true;

在我的测试中,我加载了XML文件,您可以加载您操纵后的XML字符串。

感谢您的回复...我是否需要在这里使用XmlReaderSettings对象以保留格式? - user40907
@user40907 不用,你可以直接使用这段代码,只需将你自己的 XML 文件作为纯文本加载即可。 - Shadow The Spring Wizard
@user40907,你能否发布一下设置文本框数据与 XML 相关的代码?也许我可以复现问题并解决它。 - Shadow The Spring Wizard
我只是用XML字符串设置文本框的文本属性。 - user40907

0

你尝试过确保文本框处于多行模式并且接受回车符吗?

public void CreateMyMultilineTextBox() {
   // Create an instance of a TextBox control.
   TextBox textBox1 = new TextBox();

   // Set the Multiline property to true.
   textBox1.Multiline = true;
   // Add vertical scroll bars to the TextBox control.
   textBox1.ScrollBars = ScrollBars.Vertical;
   // Allow the RETURN key to be entered in the TextBox control.
   textBox1.AcceptsReturn = true;
   // Allow the TAB key to be entered in the TextBox control.
   textBox1.AcceptsTab = true;
   // Set WordWrap to true to allow text to wrap to the next line.
   textBox1.WordWrap = true;
   // Set the default text of the control.
   textBox1.Text = "Welcome!";
 }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接