В C#, каков наилучший метод форматирования строки в формате XML?

#c# #xml #string #formatting #string-formatting

Вопрос:

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

Очень конкретно, каким должен быть метод «Что-то вроде», чтобы получить результат, приведенный ниже?

 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>
 

Ответ №1:

 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>
 

Комментарии:

1. Спасибо, это как раз то, что мне было нужно 🙂

2. Похоже, что метод Parse() не анализирует строку без объявления XML.

3. Каков метод для файла CSHTML?

Ответ №2:

К сожалению, нет, это не так просто, как метод FormatXMLForOutput, об этом здесь говорила Microsoft 😉

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

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

Ответ №3:

Используя новое пространство имен 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.

Ответ №4:

Предполагая, что вы просто хотите переформатировать 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);
 

Ответ №5:

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

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

Комментарии:

1. Я сам использовал этот подход в прошлом (относительно легко), но в .NET 2.0 и более поздних версиях Microsoft теперь рекомендует использовать класс XmlTextWrtierSettings, чтобы вы могли воспользоваться преимуществами новых функций, добавленных в 2.0 и 3.5. См. Ссылку в моем ответе.

Ответ №6:

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

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

Комментарии:

1. С таким же успехом можно было бы сделать эту 1 строку.

Ответ №7:

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

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

Ответ №8:

В рамках 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   "rn" : "")   xdoc.ToString();
Console.WriteLine(formattedXml);
 

Это добавляет необходимый отступ и сохраняет объявление Xml.

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

Ответ №9:

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

 XmlDocument xml = new XmlDocument();

xml.LoadXml( YourString );
 

Комментарии:

1. Разве вы не видели два или три других ответа, которые говорят то же самое?

Ответ №10:

Система.Xml.Linq.XElement.toString() Автоматически Форматирует!

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