43

我正在 C# 中创建一个轻量级编辑器,并且想知道将字符串转换为格式良好的 XML 字符串的最佳方法。我希望 C# 库中有一个公共方法,例如“public bool FormatAsXml(string text, out string formattedXmlText)”,但它不可能那么容易,不是吗?

非常具体地说,“SomeMethod”方法必须是什么才能产生下面的输出?

string unformattedXml;
string formattedXml;

unformattedXml = "<?xml version=\"1.0\"?><book><author>Lewis, C.S.</author><title>The Four Loves</title></book>"
formattedXml = SomeMethod(unformattedXml);

Console.WriteLine(formattedXml);

输出:

<?xml version="1.0"?>
  <book id="123">
    <author>Lewis, C.S.</author>
    <title>The Four Loves</title>
  </book>
4

10 回答 10

74
string unformattedXml = "<?xml version=\"1.0\"?><book><author>Lewis, C.S.</author><title>The Four Loves</title></book>";
string formattedXml = XElement.Parse(unformattedXml).ToString();
Console.WriteLine(formattedXml);

输出:

<book>
  <author>Lewis, C.S.</author>
  <title>The Four Loves</title>
</book>

Xml 声明不是由 ToString() 输出的,而是由 Save() 输出的......

  XElement.Parse(unformattedXml).Save(@"C:\doc.xml");
  Console.WriteLine(File.ReadAllText(@"C:\doc.xml"));

输出:

<?xml version="1.0" encoding="utf-8"?>
<book>
  <author>Lewis, C.S.</author>
  <title>The Four Loves</title>
</book>
于 2008-10-12T23:01:07.243 回答
15

不幸的是,不,它不像 FormatXMLForOutput 方法那么简单,这是微软在这里谈论的;)

无论如何,从 .NET 2.0 开始,推荐的方法是使用 XMlWriterSettingsClass 来设置格式,而不是直接在 XmlTextWriter 对象上设置属性。 有关更多详细信息,请参阅此 MSDN 页面。它说:

“在 .NET Framework 2.0 版本中,推荐的做法是使用 XmlWriter.Create 方法和 XmlWriterSettings 类创建 XmlWriter 实例。这使您可以充分利用此版本中引入的所有新功能。有关更多信息,请参阅创建 XML 写入器。"

以下是推荐方法的示例:

XmlWriterSettings settings = new XmlWriterSettings();
settings.Indent = true;
settings.IndentChars = ("    ");
using (XmlWriter writer = XmlWriter.Create("books.xml", settings))
{
    // Write XML data.
    writer.WriteStartElement("book");
    writer.WriteElementString("price", "19.95");
    writer.WriteEndElement();
    writer.Flush();
}
于 2008-10-12T02:24:37.427 回答
13

使用新的 System.Xml.Linq 命名空间(System.Xml.Linq 程序集),您可以使用以下内容:

string theString = "<nodeName>blah</nodeName>";
XDocument doc = XDocument.Parse(theString);

您还可以使用以下命令创建片段:

string theString = "<nodeName>blah</nodeName>";
XElement element = XElement.Parse(theString);

如果字符串还不是 XML,您可以执行以下操作:

string theString = "blah";
//creates <nodeName>blah</nodeName>
XElement element = new XElement(XName.Get("nodeName"), theString); 

在最后一个示例中需要注意的是,XElement 将对提供的字符串进行 XML 编码。

我强烈推荐新的 XLINQ 类。与大多数现有的 XmlDocument 相关类型相比,它们重量更轻,更易于用户使用。

于 2008-10-12T03:33:44.900 回答
9

假设您只是想重新格式化 XML 文档以将新节点放在新行上并添加缩进,那么,如果您使用的是 .NET 3.5 或更高版本,那么最好的解决方案是使用 XDocument 解析然后输出,类似于:

string unformattedXml;
string formattedXml;

unformattedXml = "<?xml version=\"1.0\"?><book><author>Lewis, C.S.</author><title>The Four Loves</title></book>";
formattedXml = System.Xml.Linq.XDocument.Parse(unformattedXml).ToString();

Console.WriteLine(formattedXml);

整齐吗?

这应该重新格式化 XML 节点。

要使用以前版本的框架执行此操作需要更多的工作,因为没有内置函数来重新计算空格。

事实上,使用 pre-Linq 类来做到这一点是:

string unformattedXml;
string formattedXml;

unformattedXml = "<?xml version=\"1.0\"?><book><author>Lewis, C.S.</author><title>The Four Loves</title></book>";
System.Xml.XmlDocument doc = new System.Xml.XmlDocument();
doc.LoadXml(unformattedXml);
System.Text.StringBuilder sb = new System.Text.StringBuilder();
System.Xml.XmlWriter xw = System.Xml.XmlTextWriter.Create(sb, new System.Xml.XmlWriterSettings() { Indent = true });
doc.WriteTo(xw);
xw.Flush();
formattedXml = sb.ToString();
Console.WriteLine(formattedXml);
于 2010-08-13T08:09:41.470 回答
5

听起来您想将 XML 加载到XmlTextWriter对象中并设置 Formatting 和 Indentation 属性:

writer.Formatting = Formatting.Indented;
writer.Indentation = 1;
writer.IndentChar = '\t';
于 2008-10-12T01:41:25.300 回答
4

Jason 的方法是最简单的。这是方法:

private static string FormatXmlString(string xmlString)
{
    System.Xml.Linq.XElement element = System.Xml.Linq.XElement.Parse(xmlString);
    return element.ToString();
}
于 2008-10-13T04:45:19.670 回答
1

如果您只需要转义 XML 字符,则以下内容可能有用:

string myText = "This & that > <> &lt;";
myText = System.Security.SecurityElement.Escape(myText);
于 2008-10-12T04:04:54.400 回答
1

在 Framework 4.0 中,这简单。

var unformattedXml = "<?xml version=\"1.0\"?><book><author>Lewis, C.S.</author><title>The Four Loves</title></book>";
var xdoc = System.Xml.Linq.XDocument.Parse(unformattedXml);
var formattedXml = (xdoc.Declaration != null ? xdoc.Declaration + "\r\n" : "") + xdoc.ToString();
Console.WriteLine(formattedXml);

这增加了所需的缩进,并维护了 Xml Declaration

<?xml version="1.0"?>
<book>
  <author>Lewis, C.S.</author>
  <title>The Four Loves</title>
</book>
于 2013-04-24T06:25:20.240 回答
0

字符串是有效的 XML 吗?您的意思是如何将 XML 字符串转换为 XML 文档?如果是这样,请执行以下操作:

XmlDocument xml = new XmlDocument();

xml.LoadXml( YourString );
于 2008-10-12T01:34:00.743 回答
0

System.Xml.Linq.XElement.ToString() 自动格式化!

XElement formattedXML = new XElement.Parse(unformattedXmlString);
Console.WriteLine(formattedXML.ToString());
于 2012-07-10T20:28:04.910 回答