2011-11-02 16 views
5

Piszę wrapper dla interfejsu XML API Braintead. Mam XDocument, który muszę przekształcić w ciąg znaków. Ze względu na fakt, że ich parsera XML jest tak wybredny, że nie może nawet obsłużyć odstępy między węzłami XML, deklaracja dokument musi być dokładnie:XDocument na ciąg znaków: Jak pominąć kodowanie w deklaracji?

<?xml version="1.0"?> 

Jednak XDocument.Save metoda() zawsze dodaje kodowanie atrybut w tej deklaracji:

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

z ostatniej godziny spędził na Google i sterta szukasz najlepszego sposobu na generowanie ciąg XML, najlepszym co mogę zrobić to:

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

Próbowałem

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

i że nie uda przy ustalaniu deklarację w XDocument sposób chcę go; jednak, gdy zadzwonię do metody Save(), atrybut kodowania zostanie magicznie wrzucony tam, bez względu na to, jaką drogę pójdę (używając TextWriter, dodając XmlWriterSettings itp.).

Czy ktoś ma lepszy sposób na zrobienie tego, czy też mój kod jest na zawsze skazany na paragraf ranting w komentarzach nad obrzydliwym zastępowaniem ciągu?

Odpowiedz

10

Cóż, koniec odbierający powinien zostać poprawiony, aby użyć parsera XML, a nie czegoś, co zrywa z składnią XML, ale z .NET, jeśli chcesz utworzyć ciąg znaków z deklaracją XML, kiedy ją zamieściłeś, działa mi następujące podejście:

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

i

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

wyjścia

<?xml version="1.0"?> 
<root>test</root> 
Powiązane problemy