在 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 中保留特殊字符的主要内容,如果未能解决你的问题,请参考以下文章
如何在具有保留字符宽度的 HTML 中使用等宽字体显示特殊的 unicode 字符
Python移除指定文件夹中所有文件名称中的特殊字符(数字特殊字符空格等)只保留字母字符