2008-10-02 9 views
9

Sytuację dokonuję serializacji obiektu w aplikacji C# VS2003/.Net 1.1. Potrzebuję jednak serializacji bez instrukcji przetwarzania. Klasa XmlSerializer wypuszcza coś takiego:Pominięcie instrukcji przetwarzania XML podczas serializacji obiektu

<?xml version="1.0" encoding="utf-16" ?> 
<MyObject> 
    <Property1>Data</Property1> 
    <Property2>More Data</Property2> 
</MyObject> 

Czy istnieje jakiś sposób, aby dostać coś jak następuje, bez przetwarzania powstałego tekstu, aby usunąć tag?

<MyObject> 
    <Property1>Data</Property1> 
    <Property2>More Data</Property2> 
</MyObject> 

Dla tych, którzy są ciekawi, mój kod wygląda następująco ...

XmlSerializer serializer = new XmlSerializer(typeof(MyObject)); 
StringBuilder builder = new StringBuilder(); 

using (TextWriter stringWriter = new StringWriter(builder)) 
{ 
    serializer.Serialize(stringWriter, comments); 
    return builder.ToString(); 
} 

Odpowiedz

3

Poniższy link przeniesie Cię do postu, w którym ktoś ma metodę tłumienia instrukcji przetwarzania, używając XmlWriter i przechodząc w stan "Element", a nie "Start". Powoduje to, że instrukcja przetwarzania nie zostanie zapisana.

Suppress Processing Instruction

Jeśli zdać XmlWriter do serializatora, będzie emitować tylko dyspozycję przetwarzanie jeśli stan na XmlWriter jest „Start” (to znaczy, nie miał nic napisany do niego jeszcze).

// Assume we have a type named 'MyType' and a variable of this type named 
'myObject' 
System.Text.StringBuilder output = new System.Text.StringBuilder(); 
System.IO.StringWriter internalWriter = new System.IO.StringWriter(output); 
System.Xml.XmlWriter writer = new System.Xml.XmlTextWriter(internalWriter); 
System.Xml.Serialization.XmlSerializer serializer = new 
System.Xml.Serialization.XmlSerializer(typeof(MyType)); 


writer.WriteStartElement("MyContainingElement"); 
serializer.Serialize(writer, myObject); 
writer.WriteEndElement(); 

W tym przypadku autor będzie w stanie „element” (wewnątrz elementu) więc nie instrukcja przetwarzania zostaną zapisane. Po zakończeniu pisania XML, możesz wyodrębnić tekst z podstawowego strumienia i przetworzyć go na treść swojego serca.

+1

Ale to wymaga jeszcze po przetworzeniu rezultat do usunięcia początkowych i końcowych znaczników MyContainingElement, nie? Chociaż przynajmniej będą one znane, więc to dobrze ... –

+1

Grałem z tym i zastąpiłem WriteStartElement z WriteRaw ("") i pozbyłem się WriteEndElement - wtedy wszystko, co musiałem zrobić, aby uzyskać dobre wyniki było TrimStart() BOM wyłączone. Chłodny! –

7

W wersji 2.0, należy użyć XmLWriterSettings.OmitXmlDeclaration i serializacji do XmlWriter - jednak nie sądzę, to istnieje w 1.1; więc nie w całości przydatne - ale po prostu jeszcze jedna rzecz "pomyśl o modernizacji" ... i tak, zdaję sobie sprawę, że nie zawsze jest to możliwe.

0

Jeśli przez "instrukcję przetwarzania" rozumiesz deklarację xml, możesz tego uniknąć, ustawiając właściwość OmitXmlDeclaration dla XmlWriterSettings. Będziesz musiał serializować przy użyciu XmlWriter, aby to osiągnąć.

XmlSerializer serializer = new XmlSerializer(typeof(MyObject)); 
StringBuilder builder = new StringBuilder(); 
XmlWriterSettings settings = new XmlWriterSettings(); 
settings.OmitXmlDeclaration = true; 

using (XmlWriter stringWriter = new StringWriter(builder, settings)) 
{ 
    serializer.Serialize(stringWriter, comments); 
    return builder.ToString(); 
} 

Ale ah, to nie odpowiada na twoje pytanie do 1.1. Cóż, w odniesieniu do innych.

8

zrobiłem małą korektę

XmlSerializer serializer = new XmlSerializer(typeof(MyObject)); 
StringBuilder builder = new StringBuilder(); 
XmlWriterSettings settings = new XmlWriterSettings(); 
settings.OmitXmlDeclaration = true; 
using (XmlWriter stringWriter = XmlWriter.Create(builder, settings)) 
{ 
    serializer.Serialize(stringWriter, comments); 
    return builder.ToString(); 
} 
+0

Dziękujemy za opublikowanie poprawki: o) – Andrew

0

Działa to w .NET 1.1. (Ale nadal powinieneś rozważyć aktualizację)

XmlSerializer s1= new XmlSerializer(typeof(MyClass)); 
    XmlSerializerNamespaces ns = new XmlSerializerNamespaces(); 
    ns.Add("", ""); 


    MyClass c= new MyClass(); 
    c.PropertyFromDerivedClass= "Hallo"; 

    sw = new System.IO.StringWriter(); 
    s1.Serialize(new XTWND(sw), c, ns); 
    .... 

    /// XmlTextWriterFormattedNoDeclaration 
    /// helper class : eliminates the XML Documentation at the 
    /// start of a XML doc. 
    /// XTWFND = XmlTextWriterFormattedNoDeclaration 
    public class XTWFND : System.Xml.XmlTextWriter 
    { 
    public XTWFND(System.IO.TextWriter w) : base(w) { Formatting = System.Xml.Formatting.Indented; } 
    public override void WriteStartDocument() { } 
    } 
1

A co z pominięciem przestrzeni nazw?

zamiast korzystania

XmlSerializerNamespaces namespaces = new XmlSerializerNamespaces(); 
       namespaces.Add("", ""); 

Ex:

<message xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\"> 
+1

http://stackoverflow.com/questions/625927/omitting-namespace-when-serializing-an-object – NetSide