2011-11-02 17 views
5

Braindead kuruluş XML API'sı için bir sarıcı yazıyorum. Bir dizeye dönüşmem gereken bir XDocument var. Nedeniyle kendi XML ayrıştırıcı hatta XML düğümleri arasında boşluk işleyemez böylece titiz olması nedeniyle, belge bildirimi TAM OLMALIDIR: AncakXDocument to string: Bildirimde kodlamayı nasıl hariç tutabilirsiniz?

<?xml version="1.0"?> 

, XDocument.Save() metodu daima bir kodlama ekler o bildiriminde öznitelik:

<?xml version="1.0" encoding="utf-16"?> 

Google ve Stack XML dize oluşturmak için en iyi yol arıyoruz harcanan geçen saat ile, yapabileceğim en iyisi:

string result = xmlStringBuilder.ToString().Replace(@"encoding=""utf-16"", string.Empty)); 

Ben

xdoc.Declaration = new XDeclaration("1.0", null, null); 

denedim ve o XDocument ben istediğim gibi beyanı ayarı başarılı gelmez; Ancak, Save() yöntemini çağırdığımda, hangi yoldan gidersek gidelim (TextWriter kullanarak, XmlWriterSettings ekleyerek vb.), kodlama özniteliği geri döndürülür.

Bunu yapmanın daha iyi bir yolu var mı, yoksa sonsuza dek dizgenin üzerindeki yorumlarda paçavra parası olmaktan kaçınan benim kodum mu?

cevap

10

Alıcının, XML ayrıştırıcısını kullanan bir XML ayrıştırıcısı kullanmak için değil, XML ayırımına sahip bir dize oluşturmak istiyorsanız, ancak XML ile birlikte bir kopyasını oluşturmak istiyorsanız, aşağıdaki yaklaşım benim için çalışır:

public class MyStringWriter : StringWriter 
{ 
    public override Encoding Encoding 
    { 
     get 
     { 
      return null; 
     } 
    } 
} 

ve

XDocument doc = new XDocument(
     new XDeclaration("1.0", null, null), 
     new XElement("root", "test") 
     ); 

    string xml; 

    using (StringWriter msw = new MyStringWriter()) 
    { 
     doc.Save(msw); 
     xml = msw.ToString(); 
    } 

    Console.WriteLine(xml); 

çıkış

<?xml version="1.0"?> 
<root>test</root> 
İlgili konular