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