2008-10-12 6 views
40

Я создаю легкий редактор на C# и хотел бы знать лучший способ преобразования строки в красиво отформатированную XML-строку. Надеюсь, что в библиотеке C# есть открытый метод, например «public bool FormatAsXml (текст строки, строка string formatXmlText)», но это не могло быть так просто, не так ли?В C#, какой лучший способ форматировать строку как XML?

В частности, какой должен быть метод «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> 

ответ

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

Выход:

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

XML-декларация не выводится ToString(), но это - Экономия() ...

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> 
+0

Спасибо, это то, что я был после :) – thatuxguy 2012-07-03 10:32:32

+0

Кажется, что метод Parse() не анализирует строку без объявления XML. – 2016-07-15 05:33:26

0

ли строка действительный XML? Вы имеете в виду, как вы можете преобразовать XML-строку в XML-документ? Если да, то это:

XmlDocument xml = new XmlDocument(); 

xml.LoadXml(YourString); 
+1

Разве вы не видели два или три других ответа, которые говорят то же самое? – cjk 2010-08-13 08:20:33

5

Это звучит, как вы хотите, чтобы загрузить XML в XmlTextWriter объектов и установить форматирование и отступы свойства:

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

Я использовал этот подход в прошлом (относительно легко), но с .NET 2.0 и более поздними версиями Microsoft теперь рекомендуют использовать класс XmlTextWrtierSettings, чтобы вы могли использовать новые функции, добавленные в версии 2.0 и 3.5. См. Ссылку в моем ответе. – Ash 2008-10-12 02:28:45

15

К сожалению, нет, это не так просто, как FormatXMLForOutput, об этом говорят Microsoft;)

В любом случае, с .NET 2.0 рекомендуется использовать XMlWriterSettingsClass для настройки форматирования, а не для установки свойств непосредственно на объект XmlTextWriter. See this MSDN page для более подробной информации. В нем написано:

«В версии .NET Framework версии 2.0 рекомендуется использовать экземпляры XmlWriter с использованием метода XmlWriter.Create и класса XmlWriterSettings. Это позволяет вам в полной мере использовать все новые функции, . этот релиз Для получения дополнительной информации см Создание 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(); 
} 
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.

1

Если вам просто нужно, чтобы избежать XML символов следующее может быть полезным:

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

Подход Джейсона является самым простым. Вот метод:

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

Предполагая, что вы как раз просто хочет переформатировать документ XML, чтобы поставить новые узлы на новые линии и добавить отступы, затем, если вы используете .NET 3.5 или выше, то лучшее решение является синтаксический анализ, затем вывод с помощью XDocument, somthing like:

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?

Это должно затем переформатировать узлы XML.

Для этого в предыдущих версиях фреймворка требуется намного больше работы, так как нет встроенных функций для пересчета пробелов.

На самом деле, сделать это с помощью классов до 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); 
0

System.Xml.Linq.XElement.ToString() автоматически форматирует!

XElement formattedXML = new XElement.Parse(unformattedXmlString); 
Console.WriteLine(formattedXML.ToString()); 
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 декларация.

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

 Смежные вопросы

  • Нет связанных вопросов^_^