15

我一直在使用基于 3rd 方 java 的 REST web 服务,它返回一个 xmlNodes 数组。

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

谢谢

4

3 回答 3

29

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

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

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

请参阅以下有关它的博客文章:

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

更新:
好的,您已经从返回的 XML 生成了类。现在您需要将 a 转换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;
}

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

您可以使用通用方法并调用

 Customer myCustomer = ConvertNode<Customer>(xmlNode);

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

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

马克

于 2009-10-14T07:15:11.710 回答
14

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

这是您可以Deserialize从 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 Object,然后找到您希望反序列化的父节点,就像我想要所有 XML 文档中的SystemInfo对象节点一样。

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

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

快乐编码:)

于 2016-09-27T07:10:03.770 回答
-1

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

于 2009-10-14T01:58:12.257 回答