最短的反序列化XmlDocument的方法

19

我正在寻找一种简洁的方法来反序列化一个XmlDocument对象。我找到了最接近的解决方案这里,但我真的很想知道是否有更好的方法来做到这一点(在.NET 4.5甚至4.6中),因为我已经拥有了 XmlDocument。

当前的代码如下:

// aciResponse.Data is a XmlDocument
MyClass response;
using (XmlReader reader = XmlReader.Create((new StringReader(aciResponse.Data.InnerXml))))
{
    var serializer = new XmlSerializer(typeof(MyClass));
    response =  (MyClass)serializer.Deserialize(reader);
}

谢谢任何更好的想法!


你能澄清一下你认为什么可能构成“更好”/“更干净”的方式吗? - Chris Walsh
1
有没有什么方法可以不需要创建/打开两个不同的读取器并使用InnerXml(字符串)来完成呢? - silent
这就是方法和扩展方法的用途,如果你正在做很多相同的代码,请提取到一个函数中... 对我来说,那段代码看起来相当简洁;所以可能需要更具体。 - Greg B
也许真的没有“更好”的解决方案-但这就是我喜欢在这里找到的;-) - silent
3个回答

23
如果您已经有一个 XmlDocument 对象,那么可以使用 XmlNodeReader
MyClass response = null;
XmlSerializer serializer = new XmlSerializer(typeof(MyClass));
using (XmlReader reader = new XmlNodeReader(aciResponse.Data))
{
    response = (MyClass)serializer.Deserialize(reader);
}

1
在我的情况下,我发现使用XmlNodeReader比使用XmlReader + StringReader快了约5倍。 - FTWinston

21
你可以不使用 XmlReader,而是使用 TextReader,并使用 TextReaderXmlSerializer.Deserialize 方法 进行重载。
示例:
void Main()
{
   String aciResponseData = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><tag><bar>test</bar></tag>";
   using(TextReader sr = new StringReader(aciResponseData))
   {
        var serializer = new System.Xml.Serialization.XmlSerializer(typeof(MyClass));
        MyClass response =  (MyClass)serializer.Deserialize(sr);
        Console.WriteLine(response.bar);
   }
}

[System.Xml.Serialization.XmlRoot("tag")]
public class MyClass
{
   public String bar;
}

1
好的,这至少是一个更短的解决方案 :) 不过我会等待,看看是否还有更多的建议。 - silent

13

有一种更好的、懒人式的方法来做这件事情,但是只有在使用Visual Studio的情况下才可能实现。

步骤:

  1. 打开Visual Studio并创建一个新的类文件(如Sample1.cs)。然后从该类文件中删除示例类定义。
  2. 将您的XML文件复制到剪贴板中(Ctrl+A,Ctrl+C)
  3. 在Visual Studio中,转到“编辑”菜单,选择“特殊粘贴”->“粘贴XML作为类”。

完成。Visual Studio将生成所有所需的类定义以对此XML进行反序列化。


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