2010-03-30 20 views
7

Ich habe die folgende Variable, die einen Dateinamen akzeptiert:Wie erstelle ich ein XML-Dokument von einem .NET-Objekt?

var xtr = new XmlTextReader(xmlFileName) { WhitespaceHandling = WhitespaceHandling.None }; 
var xd = new XmlDocument(); 
xd.Load(xtr); 

Ich mag würde, es zu ändern, so dass ich in einem Objekt passieren kann. Ich möchte das Objekt nicht zuerst als Datei serialisieren müssen.

Ist das möglich?

Update:

Meine ursprüngliche Absichten waren ein XML-Dokument zu nehmen, verschmelzen einige Xslt (in einer Datei gespeichert sind), dann ausgegeben und zurück html ... wie folgt aus:

public string TransformXml(string xmlFileName, string xslFileName) 
{ 
    var xtr = new XmlTextReader(xmlFileName) { WhitespaceHandling = WhitespaceHandling.None }; 
    var xd = new XmlDocument(); 
    xd.Load(xtr); 

    var xslt = new System.Xml.Xsl.XslCompiledTransform(); 
    xslt.Load(xslFileName); 
    var stm = new MemoryStream(); 
    xslt.Transform(xd, null, stm); 
    stm.Position = 1; 
    var sr = new StreamReader(stm); 
    xtr.Close(); 
    return sr.ReadToEnd(); 
} 

In der obigen Code lese ich in der XML aus einer Datei. Jetzt möchte ich nur mit dem Objekt arbeiten, bevor es in die Datei serialisiert wurde.

Also lassen Sie mich mein Problem veranschaulichen Code

public string TransformXMLFromObject(myObjType myobj , string xsltFileName) 
{ 
    // Notice the xslt stays the same. 
    // Its in these next few lines that I can't figure out how to load the xml document (xd) from an object, and not from a file.... 

    var xtr = new XmlTextReader(xmlFileName) { WhitespaceHandling = WhitespaceHandling.None }; 
    var xd = new XmlDocument(); 
    xd.Load(xtr); 
} 
+1

ich nicht folgen, was Sie wollen Kannst du ein besseres Beispiel veröffentlichen? –

+0

ändern * was *, damit Sie ein Objekt übergeben können? Der XmlTextReader? Sie möchten ein Objekt an den XmlTextReader übergeben? Und was erwartest du * raus *? – Cheeso

+1

@JL: Sie sollten 'new XmlTextReader()' nicht verwenden. Sie sollten stattdessen 'XmlReader.Create()' verwenden. –

Antwort

28

Sie wollen eine beliebige .NET-Objekt in eine serialisierte XML-String verwandeln? Nichts einfacher als das !! :-)

public string SerializeToXml(object input) 
{ 
    XmlSerializer ser = new XmlSerializer(input.GetType(), "http://schemas.yournamespace.com"); 
    string result = string.Empty; 

    using(MemoryStream memStm = new MemoryStream()) 
    { 
    ser.Serialize(memStm, input); 

    memStm.Position = 0; 
    result = new StreamReader(memStm).ReadToEnd(); 
    } 

    return result; 
} 

Das sollte dazu :-) Natürlich möchten Sie vielleicht den Standard-XML-Namespace auch als Parameter konfigurierbar machen.

Oder möchten Sie in der Lage sein, ein XmlDocument auf einem vorhandenen Objekt zu erstellen?

public XmlDocument SerializeToXmlDocument(object input) 
{ 
    XmlSerializer ser = new XmlSerializer(input.GetType(), "http://schemas.yournamespace.com"); 

    XmlDocument xd = null; 

    using(MemoryStream memStm = new MemoryStream()) 
    { 
    ser.Serialize(memStm, input); 

    memStm.Position = 0; 

    XmlReaderSettings settings = new XmlReaderSettings(); 
    settings.IgnoreWhitespace = true; 

    using(var xtr = XmlReader.Create(memStm, settings)) 
    { 
     xd = new XmlDocument(); 
     xd.Load(xtr); 
    } 
    } 

    return xd; 
} 
+1

@marc_s: ick! Keine 'using' Blöcke! 'new XmlTextReader()'! -1! –

+0

@John: Ich habe gerade den 'neuen XmlTextReader()' repariert .... du bist zu schnell, um ...... –

+0

@John: aber erkläre mir in einfachen und leicht verständlichen Worten den Nutzen von 'XmlReader.Create()' vs. 'new XmlTextReader()' - niemand hat bisher einen fesselnden Punkt gemacht ..... –

22

können Sie serialisiert werden direkt in die XmlDocument:

XmlDocument doc = new XmlDocument(); 
XPathNavigator nav = doc.CreateNavigator(); 
using (XmlWriter w = nav.AppendChild()) 
{ 
    XmlSerializer ser = new XmlSerializer(typeof(MyType)); 
    ser.Serialize(w, myObject); 
} 
+0

Ich denke, der ser.Serializer akzeptiert das Objekt nicht als Parameter? –

+0

uh, schön ... und keine dazwischenliegende Zeichenfolge beteiligt :) –

+0

Wenn ich nicht klar genug war, wird der obige Code nicht kompiliert, da ser.Serialize einige ungültige Parameter hat. Ansonsten sieht es wie eine elegante Lösung aus. –

3

Aufbauend auf @JohnSaunders Lösung schrieb ich die folgende generische Funktion:

public XmlDocument SerializeToXml<T>(T source) { 
    var document = new XmlDocument(); 
    var navigator = document.CreateNavigator(); 

    using (var writer = navigator.AppendChild()) { 
     var serializer = new XmlSerializer(typeof(T)); 
     serializer.Serialize(writer, source); 
    } 
    return document; 
} 
Verwandte Themen