xmlNode到对象

时间:2009-10-13 23:15:55

标签: c# serialization xmlnode

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

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

由于

3 个答案:

答案 0 :(得分:24)

如果您安装了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;
}

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

您可以使用通用方法执行此操作并调用

 Customer myCustomer = ConvertNode<Customer>(xmlNode);

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

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

马克

答案 1 :(得分:6)

这可能为时已晚,无法回答其他人:

以下是您可以从XML节点Deserialize获得的解决方案。

 XmlDocument xmlDoc = new XmlDocument();
 xmlDoc.LoadXml(xml);

 XmlNode xmlNode = xmlDoc.SelectSingleNode("//SystemInfo");

 XmlSerializer serial = new XmlSerializer(typeof(SystemInfo));

 SystemInfo syso =(SystemInfo)serial.Deserialize(new XmlNodeReader(xmlNode));

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

找到后,创建一个具有您希望的特定类类型的XmlSerializer对象。

现在只需将new XmlNodeReader(xmlNode)传递给反序列化方法,您将获得填充在类对象中的对象,就像我使用XML值填充syso对象一样。

快乐编码:)

答案 2 :(得分:-1)

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