В С#, каков наилучший способ форматирования строки как 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>
Ответы
Ответ 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 > <> <";
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());