2012-02-17 17 views
14

Próbuję wstawić plik xml bez głowy xml jak Próbowałem:Jak mogę pominąć deklarację xml podczas serializacji?

Type t = obj.GetType(); 
XmlSerializer xs=new XmlSerializer(t); 
XmlWriter xw = XmlWriter.Create(@"company.xml", 
             new XmlWriterSettings() { OmitXmlDeclaration = true, Indent = true }); 
xs.Serialize(xw,obj); 
xw.Close(); 

ale nadal outputing w pliku xml. Nie chcę tricków. Jakieś pomysły?

+1

Dlaczego chcesz coś takiego zrobić, jestem ciekawa :)? –

+0

znaleźć coś podobnego na, więc spójrz na: http://stackoverflow.com/questions/933664/net-xml-serialization-without-xml-root-node. –

+1

Może wypisywanie niektórych fragmentów, które są później dodawane do dokumentu? A może wysyłanie fragmentów XML za pomocą gniazd takich jak XMPP? Dużo do tego używam :) – dowhilefor

Odpowiedz

20

Ustaw ConformanceLevel do Fragment coś takiego:

Type t = obj.GetType(); 
XmlSerializer xs=new XmlSerializer(t); 
XmlWriter xw = XmlWriter.Create(@"company.xml", 
           new XmlWriterSettings() { 
            OmitXmlDeclaration = true 
            , ConformanceLevel = ConformanceLevel.Auto 
            , Indent = true }); 
xs.Serialize(xw,obj); 
xw.Close(); 
+9

Dziękuję, ale mam ten błąd: System.InvalidOperationException: WriteStartDocument nie można wywołać na pisarzach utworzonych za pomocą ConformanceLevel.Fragment. – orange

+8

@orange Miałem ten sam wyjątek, ale ustawienie "OmitXmlDeclaration = true" i jawne ustawienie "ConformanceLevel = ConformanceLevel.Auto' przyniosło mi oczekiwany rezultat. – Grx70

+0

@ Grx70 Miałem ten sam problem, a twoja poprawka działała również dla mnie, dzięki. –

4

Sprawdź w numerze documentation. Nie widać

The XML declaration is always written if ConformanceLevel is set to Document, even if OmitXmlDeclaration is set to true.

The XML declaration is never written if ConformanceLevel is set to Fragment. You can call WriteProcessingInstruction to explicitly write out an XML declaration.

Więc trzeba dodać

ConformanceLevel = ConformanceLevel.Fragment; 
+0

Próbowałem już z 'ConformanceLevel = ConformanceLevel.Fragment', ale serializacja kończy się niepowodzeniem. Jednak "ConformanceLevel = ConformanceLevel.Auto" działa jak uroku (jak to jest napisane w odpowiedzi Diego) – oleksa

1

Jeśli używasz przeciążenie serializacji (Stream, Object, XmlSerializerNamespaces) i zapewniają wartość null jako XmlSerializerNamespaces, a XmlSerializer nie będzie próbował uszkodzić WriteStartDocument. Wypróbuj:

xs.Serialize(xw, obj, null); 
+1

To również działa. Jeśli tworzysz niestandardową serializację części łańcucha obiektów, implementując interfejs IXmlSerializable, masz już XmlWriter, więc to rozwiązanie staje się prostsze. – NthDeveloper

Powiązane problemy