xmlNode到对象

76m*_*mel 10 c# serialization xmlnode

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

xmlNode []重新呈现一个对象,我试图找出在对象中反序列化xmlNode []的最佳方法?是首先建立一个xmlDocument和Deserialize?

谢谢

mar*_*c_s 24

如果你安装了WCF Rest Starter Kit预览版,那就有一个巧妙的方法:

  • 打开Visual Studio
  • 选择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;
}
Run Code Online (Sandbox Code Playgroud)

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

您可以使用泛型方法并调用它

 Customer myCustomer = ConvertNode<Customer>(xmlNode);
Run Code Online (Sandbox Code Playgroud)

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

 Customer myCustomer = xmlNode.ConvertNode<Customer>();
Run Code Online (Sandbox Code Playgroud)


Kha*_*sim 8

也许这已经来不及回答了,但它会帮助其他人:

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

 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));
Run Code Online (Sandbox Code Playgroud)

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

一旦你发现创建一个XmlSerializer具有你想要的特定类类型的对象.

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

快乐编码:)

  • 不要忘记XmlNodeReader需要处理。最好使用`using(XmlNodeReader reader = new XmlNodeReader(xmlNode)`)块。 (4认同)