XDocument.ToString () XML Kodlama Etiketini düşürür


103

ToString () İşlevinde xml kodlamasını almanın herhangi bir yolu var mı?

Misal:

xml.Save("myfile.xml");

sebep olur

<?xml version="1.0" encoding="utf-8"?>
<Cooperations>
  <Cooperation>
    <CooperationId>xxx</CooperationId>
    <CooperationName>Allianz Konzern</CooperationName>
    <LogicalCustomers>

Fakat

tb_output.Text = xml.toString();

bunun gibi bir çıktıya yol açar

<Cooperations>
  <Cooperation>
    <CooperationId>xxx</CooperationId>
    <CooperationName>Allianz Konzern</CooperationName>
    <LogicalCustomers>
    ...

Yanıtlar:


98

Bildirimi açıkça yazın veya a kullanın StringWriterve arayın 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);
    }
}

Bunu bir uzantı yöntemi olarak kolayca ekleyebilirsiniz:

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

Bu orada eğer patlama gitmeyecek avantajına sahiptir değil bir deklarasyon :)

O zaman şunları kullanabilirsiniz:

string x = doc.ToStringWithDeclaration();

Bunun kodlama olarak utf-16'yı kullanacağını unutmayın, çünkü bu StringWriter,. Bir alt sınıf oluşturarak bunu kendiniz etkileyebilirsiniz StringWriter, örneğin her zaman UTF-8 kullanmak .


14
Bu, XDocument bildirimindeki kodlamanın göz ardı edilmesi ve kaydetme işlemi sırasında StringWriter'ın kodlamasıyla değiştirilmesiyle ilgili küçük bir soruna sahiptir, ki bu istediğiniz olabilir veya olmayabilir
Sam Holder

2
Sonra birlikte uzantısı yöntemi birleştirir: den Utf8StringWriter stackoverflow.com/a/1564727/75963 ;)
Nick Josevski

12
Yukarıdaki uzantı yöntemini kullanmanın daha kolay olduğunu buldum, ancak şunu döndürün ... return doc.Declaration + doc.ToString (); Bildirge boşsa, yalnızca boş bir dizeyle sonuçlanır.
Steve G.

Garip, ama şimdi çalıştıramıyorum ( .net keman ) - her zaman "utf-16" kodlamasını kullanıyor. İçeriye baktım XDocument.Save(TextWriter)uygulanması ve aksine sadece, bildirgede kodlamasını görmezden XDocument.Save(String)veya XDocument.Save(Stream)uygulamalar. Acaba neden ...
Ilya Luzyanin

@IlyaLuzyanin: Evet, özelliği StringWritergeçersiz kılan bir kod kullanmadığınız sürece a'ya geçtiğinizde kodlama olarak "utf-16" kullanacaktır Encoding. Bununla ilgili başka bir cevabım var. "Kodlamayı" tamamen bıraktığını söylediğini sanıyordum ...
Jon Skeet

46

Declaration özelliği XML bildirimini içerecektir. İçeriği ve beyanı almak için aşağıdakileri yapabilirsiniz:

tb_output.Text = xml.Declaration.ToString() + xml.ToString()

7
xdocument'inizde yeni XDeclaration ("1.0", "utf-8", "yes") kullanmıyorsanız, xml.Declaration boş olduğundan bu bir hata yaratır. Ancak xml.save, doğru kodlamayı otomatik olarak algılar.
Henrik P. Hessel

veya,tb_output.Text = @"<?xml version=""1.0"" encoding=""utf-8"" ?>" + xml;
Bill Hoag

4
veya... = $"{xdoc.Declaration}{Environment.NewLine}{xdoc}";
WernerCD

9

bunu kullan:

output.Text = String.Concat(xml.Declaration.ToString() , xml.ToString())

2
Yeni XDeclaration ("1.0", "utf-8", "yes") oluşturmadan ve XDocument veya başka bir nesneye eklenmeden, xml.Declaration.ToString () boş bir istisna atar.
Ziggler

1
output.Text = String.Concat (xml.Declaration, xml): Bu Concat boş dizeleri umursamıyor çünkü aşağıda gibi daha güvenli
dmihailescu

3

Bunu beğendim

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

Distribütör bilgi almak için aşağıya bakın

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<Distributors>
  <Distributor Id="12345678" />
  <Distributor Id="22222222" />
  <Distributor Id="11111111" />
</Distributors>

1
iyi örnek. bazı notlar: 1) yeni XDeclaration ("1.0", "utf-8", "yes") yerine yeni XDeclaration ("1.0", "utf-8") kullanın, 2) son satıra yeni satır ekleyin: distributors. Declaration.ToString () + Environment.NewLine + distributors.ToString ()
Alexey Obukhov

2

Diğer +1 yanıtlarına benzer, ancak bildirim hakkında biraz daha fazla ayrıntı ve biraz daha doğru birleştirme.

<xml />bildirim, biçimlendirilmiş bir XML'de kendi satırında olmalıdır, bu yüzden yeni satırı eklediğimizden emin oluyorum. NOT: Environment.Newlinebu şekilde kullanılması platforma özel yeni satırı üretecektir

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

Her iki sonuç da şunları sağlar:

<?xml version="1.0" encoding="iso-8859-1"?>
<rss version="2.0"></rss>

1

Bu cevaplardan birkaçı posterin talebini çözüyor, ancak fazlasıyla karmaşık görünüyor. Burada, ayrı bir yazıcı ihtiyacını ortadan kaldıran, eksik bir bildirimi ele alan ve standart ToString SaveOptions parametresini destekleyen basit bir uzantı yöntemi verilmiştir.

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);
}

Sadece değiştirin uzantıyı kullanmak için xml.ToString()birliktexml.ToXmlString()


0

Ayrıca bir XmlWriter kullanabilir ve

Writer.WriteDocType() 

yöntem.


0
string uploadCode = "UploadCode";
string LabName = "LabName";
XElement root = new XElement("TestLabs");
foreach (var item in returnList)
{  
       root.Add(new XElement("TestLab",
                new XElement(uploadCode, item.UploadCode),
                new XElement(LabName, item.LabName)
                            )
               );
}

XDocument returnXML = new XDocument(new XDeclaration("1.0", "UTF-8","yes"),
             root);

string returnVal;
using (var sw = new MemoryStream())
{
       using (var strw = new StreamWriter(sw, System.Text.UTF8Encoding.UTF8))
       {
              returnXML.Save(strw);
              returnVal = System.Text.UTF8Encoding.UTF8.GetString(sw.ToArray());
       }
}

// ReturnVal has the string with XML data with XML declaration tag
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.