2010-04-22 37 views
8

我有一個.net webserivce接受字符串格式的XMLXML發送到webserivce的字符串可以表示系統中的任何對象。我需要檢查第一個節點以找出反序列化XML字符串的對象。爲此,我將不得不將XML加載到XMLDocument(不想使用RegEx或字符串比較)。我想知道是否有反序列化XMLDocument/XMLNode的方法,而不是反序列化字符串以節省一些性能?序列化XMLNode是否會有任何性能優勢,而不是字符串?如何將XMLDocument反序列化爲C#中的對象?

方法加載的XMLDocument

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

感謝

回答

22

如果你有一個XmlDocument,你可以使用XmlNodeReader作爲XmlReader傳遞給XmlSerializer,但我不知道它會更好做的另一種方式;使用XmlReader得到最外層的元素名稱,並給予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

該死的,最後一個問題,我可以用我的眼睛回答,你打我:)。 – johnc 2010-04-22 23:13:56

+0

謝謝,我會試試這個。 – Deepfreezed 2010-04-23 16:21:54

2

不要忘了一個強大的競爭者,LINQ到XML!

XElement root = XElement.Load(myfile); 

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

我正在使用的應用程序停留在.Net 2.0上。我希望事實並非如此。 – Deepfreezed 2010-04-23 16:21:26

+0

不要忘記將System.Xml.Linq添加到您的程序參考 – 2012-08-25 08:43:37