В C #, как лучше всего форматировать строку как XML? - PullRequest
40 голосов
/ 12 октября 2008

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

Конкретно, каким должен быть метод "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>

Ответы [ 10 ]

71 голосов
/ 13 октября 2008
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>
15 голосов
/ 12 октября 2008

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

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

"В выпуске .NET Framework версии 2.0 рекомендуется создавать экземпляры XmlWriter с использованием метода XmlWriter.Create и класса XmlWriterSettings. Это позволяет в полной мере использовать все новые функции, представленные в этом выпуске. дополнительную информацию см. в разделе «Создание XML Writers».

Вот пример рекомендуемого подхода:

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 голосов
/ 12 октября 2008

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

9 голосов
/ 13 августа 2010

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

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

Фактически, сделать это, используя классы до 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 голосов
/ 12 октября 2008

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

writer.Formatting = Formatting.Indented;
writer.Indentation = 1;
writer.IndentChar = '\t';
4 голосов
/ 13 октября 2008

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

private static string FormatXmlString(string xmlString)
{
    System.Xml.Linq.XElement element = System.Xml.Linq.XElement.Parse(xmlString);
    return element.ToString();
}
1 голос
/ 24 апреля 2013

В 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>
1 голос
/ 12 октября 2008

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

string myText = "This & that > <> &lt;";
myText = System.Security.SecurityElement.Escape(myText);
0 голосов
/ 11 июля 2012

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

XElement formattedXML = new XElement.Parse(unformattedXmlString);
Console.WriteLine(formattedXML.ToString());
0 голосов
/ 12 октября 2008

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

XmlDocument xml = new XmlDocument();

xml.LoadXml( YourString );
...