代码之家  ›  专栏  ›  技术社区  ›  Deepfreezed

如何将xmldocument反序列化为c中的object?

  •  8
  • Deepfreezed  · 技术社区  · 15 年前

    我有一个接受 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 回复  |  直到 15 年前
        1
  •  22
  •   Marc Gravell    15 年前

    如果你有一个 XmlDocument ,您可以使用 XmlNodeReader 作为一个 XmlReader 传到 XmlSerializer ,但我想知道用另一种方法是否更好;使用 XMLRead 获取最外层的元素名,并给出 那个 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
  •  2
  •   Aren    15 年前

    不要忘记一个强有力的竞争者,linq到xml!

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