2008-10-12 36 views
40

Tôi đang tạo một trình soạn thảo gọn nhẹ trong C# và muốn biết phương pháp tốt nhất để chuyển đổi chuỗi thành chuỗi XML được định dạng độc đáo. Tôi hy vọng rằng có một phương pháp công khai trong thư viện C# như "bool Public FormatXML" (chuỗi văn bản, chuỗi định dạng raXmlText) ", nhưng nó không thể dễ dàng như vậy, phải không?Trong C#, phương pháp tốt nhất để định dạng một chuỗi như XML là gì?

Rất cụ thể, phương pháp "SomeMethod" phải là gì để tạo ra kết quả dưới đây?

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

Output:

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

Trả lời

69
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); 

Output:

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

khai báo XML không phải là đầu ra của ToString(), nhưng nó là bởi Lưu() ...

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

Đầu ra:

<?xml version="1.0" encoding="utf-8"?> 
<book> 
    <author>Lewis, C.S.</author> 
    <title>The Four Loves</title> 
</book> 
+0

Cảm ơn, đây chỉ là những gì tôi đã sau :) – thatuxguy

+0

Dường như phương thức Parse() không phân tích một chuỗi mà không có khai báo XML. –

0

Là chuỗi XML hợp lệ? Bạn có nghĩa là làm thế nào bạn có thể chuyển đổi một chuỗi XML thành một tài liệu XML? Nếu vậy, làm như sau:

XmlDocument xml = new XmlDocument(); 

xml.LoadXml(YourString); 
+1

Bạn không thấy hai hoặc ba câu trả lời khác có cùng nội dung chính xác không? – cjk

5

Có vẻ như bạn muốn tải XML thành một XmlTextWriter đối tượng và thiết lập các định dạng và lõm thuộc tính:

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

Tôi đã sử dụng phương pháp này trong quá khứ (tương đối dễ), nhưng với .NET 2.0 trở lên, Microsoft hiện khuyên bạn nên sử dụng lớp XmlTextWrtierSettings để bạn có thể tận dụng các tính năng mới được thêm vào trong 2.0 và 3.5. Xem liên kết trong câu trả lời của tôi. – Ash

15

Đáng tiếc là không có, nó không phải là dễ dàng như một Phương thức FormatXMLForOutput, đây là Microsoft đang nói đến ở đây;)

Dù sao, như .NET 2.0, cách tiếp cận được khuyến nghị là sử dụng XMlWriterSettingsClass để thiết lập định dạng, trái với thuộc tính thiết lập trực tiếp trên đối tượng XmlTextWriter. See this MSDN page để biết thêm chi tiết. Nó nói:

"Trong phiên bản .NET Framework 2.0, thực hành được khuyến nghị là tạo các cá thể XmlWriter bằng phương pháp XmlWriter.Create và lớp XmlWriterSettings. Điều này cho phép bạn tận dụng tối đa tất cả các tính năng mới được giới thiệu trong . phiên bản này Để biết thêm thông tin, xem Tạo XML Writers "

Dưới đây là một ví dụ về cách tiếp cận đề nghị:.

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

Sử dụng namespace System.Xml.Linq mới (System.Xml.Linq hội) bạn có thể sử dụng các mục sau:

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

Bạn cũng có thể tạo ra một mảnh với:

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

Nếu chuỗi chưa XML, bạn có thể làm một cái gì đó như thế này:

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

Something cần lưu ý trong ví dụ cuối cùng này là rằng XElement sẽ XML Mã hóa chuỗi được cung cấp.

Tôi khuyên bạn nên sử dụng các lớp XLINQ mới. Chúng có trọng lượng nhẹ hơn và dễ sử dụng hơn đối với hầu hết các loại liên quan XmlDocument hiện có.

1

Nếu bạn chỉ cần thoát khỏi nhân vật XML sau đây có thể có ích:

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

Cách tiếp cận của Jason là đơn giản nhất. Dưới đây là phương pháp:

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

Cũng có thể làm cho 1 dòng đó. – mpen

9

Giả sử your're chỉ đơn giản là muốn tái định dạng một tài liệu XML để đưa các nút mới trên dây chuyền mới và thêm thụt, sau đó, nếu bạn đang sử dụng .NET 3.5 hoặc cao hơn thì giải pháp tốt nhất là để phân tích cú pháp sau đó đầu ra với XDocument, somthing như:

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

Neat hu?

Điều này sau đó sẽ định dạng lại các nút XML.

Để thực hiện việc này với các phiên bản trước của khung công tác, cần phải có nhiều thao tác hơn vì không có chức năng tích hợp để tính lại khoảng trắng.

Trong thực tế, để làm điều đó bằng lớp trước LINQ sẽ là:

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); 
0

System.Xml.Linq.XElement.ToString() tự động định dạng!

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

Trong Framework 4.0 nó đơn giản.

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

này cho biết thêm trong thụt đầu dòng cần thiết, và duy trì Tuyên bố Xml.

<?xml version="1.0"?> 
<book> 
    <author>Lewis, C.S.</author> 
    <title>The Four Loves</title> 
</book> 
Các vấn đề liên quan