XDocument.ToString() удаляет тег кодирования XML
Есть ли способ получить кодировку xml в функции toString()?
Пример:
xml.Save("myfile.xml");
приводит к
<?xml version="1.0" encoding="utf-8"?>
<Cooperations>
<Cooperation>
<CooperationId>xxx</CooperationId>
<CooperationName>Allianz Konzern</CooperationName>
<LogicalCustomers>
Но
tb_output.Text = xml.toString();
приводит к выводу, подобному этому
<Cooperations>
<Cooperation>
<CooperationId>xxx</CooperationId>
<CooperationName>Allianz Konzern</CooperationName>
<LogicalCustomers>
...
Ответы
Ответ 1
Либо явно выпишите объявление, либо используйте StringWriter
и вызовите Save()
:
using System;
using System.IO;
using System.Text;
using System.Xml.Linq;
class Test
{
static void Main()
{
string xml = @"<?xml version='1.0' encoding='utf-8'?>
<Cooperations>
<Cooperation />
</Cooperations>";
XDocument doc = XDocument.Parse(xml);
StringBuilder builder = new StringBuilder();
using (TextWriter writer = new StringWriter(builder))
{
doc.Save(writer);
}
Console.WriteLine(builder);
}
}
Вы можете легко добавить это как метод расширения:
public static string ToStringWithDeclaration(this XDocument doc)
{
if (doc == null)
{
throw new ArgumentNullException("doc");
}
StringBuilder builder = new StringBuilder();
using (TextWriter writer = new StringWriter(builder))
{
doc.Save(writer);
}
return builder.ToString();
}
Это имеет то преимущество, что он не будет бить, если нет объявления:)
Затем вы можете использовать:
string x = doc.ToStringWithDeclaration();
Обратите внимание, что это будет использовать utf-16 в качестве кодировки, потому что это неявное кодирование в StringWriter
. Вы можете повлиять на это самостоятельно, создав подкласс StringWriter
, например. чтобы всегда использовать UTF-8.
Ответ 2
Свойство декларации будет содержать объявление XML. Чтобы получить декларацию содержимого плюс, вы можете сделать следующее:
tb_output.Text = xml.Declaration.ToString() + xml.ToString()
Ответ 3
используйте это:
output.Text = String.Concat(xml.Declaration.ToString() , xml.ToString())
Ответ 4
Мне понравилось это
string distributorInfo = string.Empty;
XDocument distributors = new XDocument();
//below is important else distributors.Declaration.ToString() throws null exception
distributors.Declaration = new XDeclaration("1.0", "utf-8", "yes");
XElement rootElement = new XElement("Distributors");
XElement distributor = null;
XAttribute id = null;
distributor = new XElement("Distributor");
id = new XAttribute("Id", "12345678");
distributor.Add(id);
rootElement.Add(distributor);
distributor = new XElement("Distributor");
id = new XAttribute("Id", "22222222");
distributor.Add(id);
rootElement.Add(distributor);
distributors.Add(rootElement);
distributorInfo = String.Concat(distributors.Declaration.ToString(), distributors.ToString());
Пожалуйста, см. ниже, что я получаю в distributorInfo
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<Distributors>
<Distributor Id="12345678" />
<Distributor Id="22222222" />
<Distributor Id="11111111" />
</Distributors>
Ответ 5
Подобно другим +1 ответам, но немного более подробно об объявлении и чуть более точной конкатенации.
<xml />
Объявление должно быть в отдельной строке в форматированном XML, поэтому я уверен, что мы добавили новую строку.
ПРИМЕЧАНИЕ: используя Environment.Newline
, чтобы он создавал новую строку новой платформы
// Parse xml declaration menthod
XDocument document1 =
XDocument.Parse(@"<?xml version=""1.0"" encoding=""iso-8859-1""?><rss version=""2.0""></rss>");
string result1 =
document1.Declaration.ToString() +
Environment.NewLine +
document1.ToString() ;
// Declare xml declaration method
XDocument document2 =
XDocument.Parse(@"<rss version=""2.0""></rss>");
document2.Declaration =
new XDeclaration("1.0", "iso-8859-1", null);
string result2 =
document2.Declaration.ToString() +
Environment.NewLine +
document2.ToString() ;
Оба результата производят:
<?xml version="1.0" encoding="iso-8859-1"?>
<rss version="2.0"></rss>
Ответ 6
Вы также можете использовать XmlWriter и вызвать
Writer.WriteDocType()
метод.
Ответ 7
Некоторые из этих ответов решают запрос плаката, но кажутся чрезмерно сложными. Здесь простой метод расширения, который позволяет избежать необходимости отдельного писателя, обрабатывает отсутствующее объявление и поддерживает стандартный параметр ToString SaveOptions.
public static string ToXmlString(this XDocument xdoc, SaveOptions options = SaveOptions.None)
{
var newLine = (options & SaveOptions.DisableFormatting) == SaveOptions.DisableFormatting ? "" : Environment.NewLine;
return xdoc.Declaration == null ? xdoc.ToString(options) : xdoc.Declaration + newLine + xdoc.ToString(options);
}
Чтобы использовать расширение, просто замените xml.ToString()
на xml.ToXmlString()