XmlNode转换为对象

17
我一直在使用一个基于Java的第三方REST Web服务,它返回一个xmlNodes数组。
这个xmlNode[]表示一个对象,我正在尝试找出将xmlNode[]反序列化成对象的最佳方法?是先构建一个xmlDocument再进行反序列化吗?
谢谢。
3个回答

32
如果您安装了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[](序列化对象)转换的最佳方法是什么。 - 76mel

19

也许回答有些晚了,但这将对其他人有所帮助:

这里是解决方案,您将能够从XML节点中进行反序列化

 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对象中,然后找到您想要反序列化的父节点,就像我想从整个XML文档中获取对象节点一样。

找到后,使用特定类类型创建一个XmlSerializer对象。

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

愉快地编码 :)


6
别忘了 XmlNodeReader 需要进行处理。最好使用 using (XmlNodeReader reader = new XmlNodeReader(xmlNode)) 块来处理它。 - Ian Goldby

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

3
明显但无用。当然我需要XMLSerializer,但我有一个XML节点而不是字符串或流。幸运的是,通过谷歌搜索可以找到这个问题的另一个有用的答案。 - edc65

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接