在 xml 中保留特殊字符

Posted

技术标签:

【中文标题】在 xml 中保留特殊字符【英文标题】:Preserving special chars in xml 【发布时间】:2011-05-08 20:59:09 【问题描述】:

我在 db 表中存储了一个带有换行符的 xml 字符串。 在我的 C# 3.5 程序中,我使用 Linq to xml 加载和操作它,然后在 UI 表单的文本框控件中将其显示为字符串。

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

我可以缩进,但是如何在 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 换行符像 UI 中的换行符一样? 还有一个问题:当您说“// 不起作用”时,您的意思是它显示了两个换行符,或者根本没有换行符? Beemer,它不会在 UI 的 xml 中显示任何新行。 你能举个例子吗?比如,xmlFromDbWithLFChars 变量中包含的输入值是什么? +5?这个问题一团糟。它似乎与 C# 或 XML 没有任何关系,就像它与 UI 控件的关系一样。 【参考方案1】:

您要做的是在 XmlWriter 上设置格式设置,因此更改您的行:

var settings = new XmlWriterSettings() 
     
     Indent = true 
    ; 

到这样的事情:

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

【讨论】:

感谢 Almund!。我原来的方法中唯一错过的是使用“NewLineOnAttributes = true”,这似乎很好用!!! 很容易错过,很高兴它有帮助!【参考方案2】:

感谢大家的回复。最后,我可以得到这个工作。

我的方法不使用 Linq2Xml/SAX 解析器。我使用 StringBuilder 生成 xml 并在 winforms 富文本框控件的 UI 中显示它。现在,我可以在 UI 中看到换行符。

【讨论】:

您应该添加您使用的解决方案作为答案。 "使用 StringBuilder 生成 xml" - 很抱歉,但在地狱里没有办法这是正确的。 XML 不是字符串数据,无论是 regex 解析还是 stringbuilder 组装都试图将其视为这样,缺乏严谨性,易于维护并且极易出现人为错误。 Annakata,你说的是真的,但是,不幸的是,我不能给商业同样的理由......因为我不想走 StringBuilder 的方式,知道它是脆弱的代码,我首先尝试使用 Linq2API、SAX 和 DOM 解析器...但 cudnt 得到所需的格式化输出。谢谢。【参考方案3】:

每当您将 XML 文档转换为字符串并开始操作该字符串时,您应该对自己说:“我自己,我做错了什么。”我不确定你的描述是否属实,但我敢打赌。

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

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

当您执行此操作时,解析器将在已解析的XElement 文档的文本节点中留下空白字符,与它们在原始字符串中的位置完全相同。 XmlWriter 不会与文本节点中现有的空格混淆(尽管如果你告诉它缩进它会添加新的空格),所以这应该会得到你想要的。

【讨论】:

嗨罗伯特,感谢您的回复...但是这种方法对我不起作用...我仍然无法在 UI 的 textarea 中的 xml 中看到换行符。 当你说“textarea”时,你的意思是html TEXTAREA吗?因为 TEXTAREA 元素中的新行由 CR/LF 对指示。如果 XML 文本中只有 LF 字符,它们将不会在 TEXTAREA 中呈现为换行符。 它是 .Net Winform 上的一个文本框控件。 那么这个问题和XML没有关系吧? 愚蠢的问题,但文本框多行启用了吗?它接受回车吗?【参考方案4】:

您可以使用 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 不,您可以按原样使用代码,只需将您自己的 XML 加载为纯文本即可。 @user40907 你能发布你如何使用 XML 设置文本框数据的代码吗?也许我可以重现然后解决这个问题。 我只是用xml字符串设置文本框的文本属性。【参考方案5】:

您是否尝试过确保文本框处于多行模式和accepts carriage return?

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!";
 

【讨论】:

以上是关于在 xml 中保留特殊字符的主要内容,如果未能解决你的问题,请参考以下文章

dom4j解析标签名中含有特殊字符报错

在 Spark 表列名中保留特殊字符

如何在具有保留字符宽度的 HTML 中使用等宽字体显示特殊的 unicode 字符

Python移除指定文件夹中所有文件名称中的特殊字符(数字特殊字符空格等)只保留字母字符

Python移除指定文件夹中所有文件名称中的特殊字符(数字特殊字符空格等)只保留字母字符

如何转义xml中的特殊字符