【问题标题】:How to Deserialize XMLDocument to object in C#?如何将 XMLDocument 反序列化为 C# 中的对象?
【发布时间】:2011-02-11 07:09:54
【问题描述】:

我有一个接受 XML 字符串格式的 .Net 网络服务。 XML 发送到网络服务的字符串可以代表系统中的任何对象。我需要检查第一个节点以确定要反序列化 XML 字符串的对象。为此,我必须将 XML 加载到 XMLDocument 中(不想使用 RegEx 或字符串比较)。我想知道是否有办法反序列化 XMLDocument/XMLNode 而不是反序列化字符串以节省一些性能?序列化 XMLNode 而不是字符串会带来任何性能优势吗?

加载 XMLDocument 的方法

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

谢谢

【问题讨论】:

    标签: c# .net xml web-services xml-deserialization


    【解决方案1】:

    不要忘记一个强大的竞争者,LINQ to XML!

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

    【讨论】:

    • 我正在处理的应用程序卡在 .Net 2.0 上。我希望不是这样。
    • 不要忘记将 System.Xml.Linq 添加到程序的引用中
    【解决方案2】:

    如果你有XmlDocument,你可以使用XmlNodeReader 作为XmlReader 传递给XmlSerializer,但我想知道用另一种方式做会不会更好;使用XmlReader 获取最外层的元素名称,并将 that 赋予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);
                }
            }            
        }
    }
    

    【讨论】:

    • 该死的,终于有一个我可以闭上眼睛回答的问题了,你把我打败了:)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-19
    • 1970-01-01
    相关资源
    最近更新 更多