在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 > <> <"; 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());