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 91

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

используйте этот:

output.Text = String.Concat(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>

вы также можете использовать XmlWriter и называют

Writer.WriteDocType() 

метод.

некоторые из этих ответов решают запрос плаката, но кажутся слишком сложными. Вот простой метод расширения, который позволяет избежать необходимости в отдельном писателе, обрабатывает отсутствующее объявление и поддерживает стандартный параметр 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()