Как десериализовать XMLDocument для объекта в C #? - PullRequest
8 голосов
/ 23 апреля 2010

У меня есть .Net webserivce, который принимает XML в строковом формате. XML Строка, отправляемая в webserivce, может представлять любой объект в системе. Мне нужно проверить первый узел, чтобы выяснить, какой объект десериализовать строку XML. Для этого мне нужно будет загрузить XML в XMLDocument (не хочу использовать RegEx или сравнение строк). Мне интересно, есть ли способ десериализации XMLDocument/XMLNode, а не десериализация строки для сохранения производительности? Будет ли какой-либо выигрыш в производительности сериализации XMLNode, а не строки?

Способ загрузки XMLDocument

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

Спасибо

Ответы [ 2 ]

22 голосов
/ 23 апреля 2010

Если у вас есть 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);
            }
        }            
    }
}
2 голосов
/ 23 апреля 2010

Не забудьте о мощном сопернике, LINQ to XML!

XElement root = XElement.Load(myfile);

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