2010-04-22 29 views
8

Tôi có một webserivce .Net chấp nhận XML ở định dạng chuỗi. XML Chuỗi được gửi vào webserivce có thể đại diện cho bất kỳ đối tượng nào trong hệ thống. Tôi cần phải kiểm tra nút đầu tiên để tìm ra đối tượng nào để deserialize chuỗi XML. Đối với điều này tôi sẽ phải tải XML vào một XMLDocument (Không muốn sử dụng RegEx hoặc so sánh chuỗi). Tôi tự hỏi nếu có một cách để Deserialize các XMLDocument/XMLNode thay vì deserializing chuỗi để tiết kiệm một số hiệu suất? Liệu sẽ có bất kỳ lợi ích hiệu suất nào tuần tự hóa các XMLNode thay vì chuỗi đó?Làm cách nào để Deserialize XMLDocument thành đối tượng trong C#?

Phương pháp để tải XMLDocument

public void LoadFromString(String s) 
{ 
    m_XmlDoc = new XmlDocument(); 
    m_XmlDoc.LoadXml(s);   
} 

Cảm ơn

Trả lời

22

Nếu bạn có một XmlDocument, bạn có thể sử dụng XmlNodeReader như một XmlReader để vượt qua để XmlSerializer, nhưng tôi tự hỏi, nếu nó sẽ là tốt hơn để làm điều đó cách khác; sử dụng một XmlReader để có được tên phần tử ngoài cùng, và cung cấp cho rằng-XmlSerializer ...

[XmlRoot("foo")] 
public class Foo 
{ 
    [XmlAttribute("id")] 
    public int Id { get; set; } 
} 
static class Program 
{ 
    static void Main() 
    { 
     string xml = "<foo id='123'/>"; 
     object obj; 
     using (XmlReader reader = XmlReader.Create(new StringReader(xml))) 
     { 
      reader.MoveToContent(); 
      switch (reader.Name) 
      { 
       case "foo": 
        obj = new XmlSerializer(typeof(Foo)).Deserialize(reader); 
        break; 
       default: 
        throw new NotSupportedException("Unexpected: " + reader.Name); 
      } 
     }    
    } 
} 
+0

Chết tiệt, cuối cùng là câu hỏi tôi có thể trả lời bằng mắt mình, bạn đã đánh tôi với nó :). – johnc

+0

Cảm ơn, tôi sẽ thử. – Deepfreezed

2

Đừng quên một đối thủ mạnh mẽ, LINQ to XML!

XElement root = XElement.Load(myfile); 

var foos = root.Descendants("Foo").Where(e => e.Attribute("bar") != null); 
+0

Ứng dụng tôi đang làm việc bị kẹt trên .Net 2.0. Tôi ước rằng đó không phải là trường hợp. – Deepfreezed

+0

đừng quên thêm System.Xml.Linq vào tham chiếu của chương trình –

Các vấn đề liên quan