在C#中,将string格式化为XML的最佳方法是什么?

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

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

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

输出:

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

输出:

 <book> <author>Lewis, CS</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, CS</author> <title>The Four Loves</title> </book> 

不幸的是,这不像FormatXMLForOutput方法那么容易,这是微软在这里所说的;)

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

“在.NET Framework 2.0版本中,build议的做法是使用XmlWriter.Create方法和XmlWriterSettings类创buildXmlWriter实例,这样可以充分利用此版本中引入的所有新function。请参阅创buildXML作者。“

这是一个推荐方法的例子:

 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(); } 

使用新的System.Xml.Linq命名空间(System.Xml.Linq Assembly),可以使用以下命令:

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

你也可以创build一个片段:

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

如果string还不是XML,那么可以这样做:

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

在这最后一个例子中要注意的是XElement将XML编码提供的string。

我强烈推荐新的XLINQ类。 它们重量更轻,并且更容易使用大多数现有的与XmlDocument相关的types。

假设你只是想重新格式化一个XML文档,把新节点放在新行上并添加缩进,那么,如果你使用的是.NET 3.5或更高版本,那么最好的解决scheme是parsing然后用XDocument输出,例如:

 string unformattedXml; string formattedXml; unformattedXml = "<?xml version=\"1.0\"?><book><author>Lewis, CS</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, CS</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); 

这听起来像你想要将XML加载到一个XmlTextWriter对象,并设置格式和缩进属性:

 writer.Formatting = Formatting.Indented; writer.Indentation = 1; writer.IndentChar = '\t'; 

杰森的方法是最简单的。 这里的方法是:

 private static string FormatXmlString(string xmlString) { System.Xml.Linq.XElement element = System.Xml.Linq.XElement.Parse(xmlString); return element.ToString(); } 

如果你只是需要转义XML字符,以下可能是有用的:

 string myText = "This & that > <> &lt;"; myText = System.Security.SecurityElement.Escape(myText); 

在Framework 4.0中很简单。

 var unformattedXml = "<?xml version=\"1.0\"?><book><author>Lewis, CS</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声明

 <?xml version="1.0"?> <book> <author>Lewis, CS</author> <title>The Four Loves</title> </book> 

string是否有效的XML? 你是说如何将XMLstring转换成XML文档? 如果是,请执行以下操作:

 XmlDocument xml = new XmlDocument(); xml.LoadXml( YourString ); 

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

 XElement formattedXML = new XElement.Parse(unformattedXmlString); Console.WriteLine(formattedXML.ToString());