2010-03-30 32 views
7

Tôi có biến sau đó chấp nhận một tên file:Làm thế nào để tạo một tài liệu XML từ một đối tượng .NET?

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

Tôi muốn thay đổi nó để tôi có thể vượt qua trong một đối tượng. Tôi không muốn phải serialize các đối tượng để tập tin đầu tiên.

Điều này có khả thi không?

Cập nhật:

ý định ban đầu của tôi là để có một tài liệu xml, sáp nhập một số XSLT (được lưu trữ trong một tập tin), sau đó đầu ra và trở về html ... như thế này:

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

Trong ở trên mã tôi đang đọc trong xml từ một tập tin. Bây giờ những gì tôi muốn làm là chỉ làm việc với đối tượng, trước khi nó được tuần tự hóa vào tệp.

Vì vậy, hãy để tôi minh họa cho vấn đề của tôi sử dụng mã

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

Tôi không làm theo những gì bạn đang mong muốn làm, bạn có thể đăng một ví dụ tốt hơn? –

+0

thay đổi * những gì * để bạn có thể chuyển vào một đối tượng? XmlTextReader? bạn muốn truyền một đối tượng cho XmlTextReader? Và những gì bạn mong đợi để có được * ra *? – Cheeso

+1

@JL: bạn không nên sử dụng 'new XmlTextReader()'. Bạn nên sử dụng 'XmlReader.Create()' để thay thế. –

Trả lời

28

Bạn muốn chuyển một đối tượng .NET tùy ý vào một chuỗi XML serialized? Không có gì đơn giản hơn thế !! :-)

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

Điều đó nên :-) Tất nhiên bạn cũng có thể muốn đặt không gian tên XML mặc định có thể định cấu hình làm tham số.

Hoặc bạn có muốn tạo XmlDocument trên đầu đối tượng hiện tại không?

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! Không có khối 'sử dụng'! 'new XmlTextReader()'! -1! –

+0

@John: Tôi vừa sửa chữa 'new XmlTextReader()' .... bạn quá nhanh để downvote ...... –

+0

@John: nhưng giải thích cho tôi trong những từ đơn giản và dễ hiểu lợi ích của 'XmlReader.Create()' so với 'new XmlTextReader()' - không ai đã tạo ra một điểm hấp dẫn cho đến nay ..... –

22

Bạn có thể serialize trực tiếp vào 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

Tôi nghĩ rằng ser.Serializer không chấp nhận đối tượng như một tham số? –

+0

uh, đẹp ... và không có chuỗi trung gian nào liên quan :) –

+0

Nếu tôi không đủ rõ ràng, mã ở trên không biên dịch vì ser.Serialize có một số tham số không hợp lệ. Nếu không nó trông giống như một giải pháp thanh lịch. –

3

Mở rộng trên giải pháp @JohnSaunders tôi đã viết một hàm tổng quát sau:

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; 
} 
Các vấn đề liên quan