【问题标题】:xmlNode to objectsxmlNode 到对象
【发布时间】:2010-12-06 12:22:00
【问题描述】:

我一直在使用基于 Java 的第 3 方 REST Web 服务,它返回一个 xmlNode 数组。

xmlNode[] 代表一个对象,我正在尝试找出反序列化对象中的 xmlNode[] 的最佳方法?是先建立一个xmlDocument然后反序列化?

谢谢

【问题讨论】:

    标签: c# serialization xmlnode


    【解决方案1】:

    如果您安装了 WCF Rest Starter Kit 预览版,有一个巧妙的技巧:

    • 打开 Visual Studio
    • 选择您的 XML 节点内容(构成您的节点之一的 XML)并将其复制到剪贴板
    • 从 Visual Studio 的“编辑”菜单中选择“将 XML 粘贴为类型”

    这会将剪贴板上的 XML 作为能够反序列化该确切 XML 的 C# 类粘贴到项目中。很漂亮!

    请参阅以下博客文章:

    这应该可以为您节省大量打字时间,让生活更轻松!

    更新:
    好的,您已经从返回的 XML 生成了类。现在您需要将XmlNode 转换为您的班级。

    你必须这样做:

    private static T ConvertNode<T>(XmlNode node) where T: class
    {
        MemoryStream stm = new MemoryStream();
    
        StreamWriter stw = new StreamWriter(stm);
        stw.Write(node.OuterXml);
        stw.Flush();
    
        stm.Position = 0;
    
        XmlSerializer ser = new XmlSerializer(typeof(T));
        T result = (ser.Deserialize(stm) as T);
    
        return result;
    }
    

    您需要将XmlNode 的XML 表示(属性.OuterXml)写入流(此处为MemoryStream),然后使用XmlSerializer 从该流中序列化回对象。

    你可以使用泛型方法并调用

     Customer myCustomer = ConvertNode<Customer>(xmlNode);
    

    或者您甚至可以将该代码转换为 XmlNode 类的扩展方法,这样您就可以编写:

     Customer myCustomer = xmlNode.ConvertNode<Customer>();
    

    马克

    【讨论】:

    • 嗨,我已经有了 xsd 中的对象,所以我真的不需要执行此步骤。我想了解 xmlNodes[](序列化对象)的最佳方法。
    【解决方案2】:

    也许在这里回答为时已晚,但它会帮助其他人:

    这是您可以从 XML 节点Deserialize 的解决方案。

     XmlDocument xmlDoc = new XmlDocument();
     xmlDoc.LoadXml(xml);
    
     XmlNode xmlNode = xmlDoc.SelectSingleNode("//SystemInfo");
    
     XmlSerializer serial = new XmlSerializer(typeof(SystemInfo));
     
     using(XmlNodeReader reader = new XmlNodeReader(xmlNode)) {
         SystemInfo syso =(SystemInfo)serial.Deserialize(reader);
     }
    

    首先将 XML 加载到 XmlDocument Object,然后找到您希望反序列化的父节点,就像我想要所有 XML 文档中的 SystemInfo 对象节点一样。

    一旦您发现创建一个具有您希望的特定类类型的 XmlSerializer 对象。

    现在只需将 reader(使用 using 创建)传递给 Deserialize 方法,您将在类对象中填充对象,就像我使用 XML 值填充 syso 对象一样.

    快乐编码:)

    【讨论】:

    • 不要忘记 XmlNodeReader 需要处理。最好使用using (XmlNodeReader reader = new XmlNodeReader(xmlNode) 块。
    【解决方案3】:

    最简单的方法是使用 .NET 中内置的 System.Xml.Serialization.XmlSerializer 类。谷歌搜索 XmlSerializer 将提供大量教程,您可以使用这些教程找到适合您的教程。

    【讨论】:

    • 明显且无用。当然我需要 XMLSerializer,但我有一个 XML 节点,而不是字符串或流。幸运的是,谷歌搜索为这个问题提供了另一个有用的答案
    猜你喜欢
    • 2011-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-10
    • 1970-01-01
    相关资源
    最近更新 更多