我一直在使用第三方基于Java的REST Web服务,它返回一个xmlNodes数组。
xmlNode []会出现一个对象,我正在尝试找出对象中反序列化xmlNode []的最佳方法吗?是首先建立一个xmlDocument和反序列化吗?
由于
答案 0 :(得分:24)
如果您安装了WCF Rest Starter Kit预览版,那就有一个巧妙的技巧:
这会将剪贴板上的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上进行谷歌搜索将提供大量的教程,您可以使用这些教程找到适合您的教程。