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>
...
7 ответов:
либо явно выпишите объявление, либо используйте
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.
свойство объявления будет содержать объявление XML. Чтобы получить объявление contents plus, вы можете сделать следующее:
tb_output.Text = xml.Declaration.ToString() + xml.ToString()
мне это понравилось
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>
похоже на другие ответы +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>
некоторые из этих ответов решают запрос плаката, но кажутся слишком сложными. Вот простой метод расширения, который позволяет избежать необходимости в отдельном писателе, обрабатывает отсутствующее объявление и поддерживает стандартный параметр 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()