Подтвердить что ты не робот

В С#, каков наилучший способ форматирования строки как XML?

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

В частности, каков будет метод "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>
4b9b3361

Ответ 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>

Ответ 2

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

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

"В версии .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();
}

Ответ 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, 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);

Неактивный hu?

Затем следует переформатировать узлы 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';

Ответ 6

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

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

Ответ 7

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

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

Ответ 8

В 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>

Ответ 9

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

XmlDocument xml = new XmlDocument();

xml.LoadXml( YourString );

Ответ 10

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

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