2013-02-24 83 views
3

我有一个普通的旧XML文件。通过一些神奇的XSD.EXE我做了一个模型。现在我想将XML数据读入模型中。通常这只是XmlSerializer.Deserialize,但它一直在抱怨命名空间和什么。将XML反序列化为没有模糊的模型

现在是这样的事情:我不关心名称空间或XML中的其他任何东西。我只是想让反序列化与“简单单线程”一起工作。我打算在我的生活中解析很多XML,并且我不想花费时间来处理臃肿的格式,这些格式我们都知道并不重要。

所以我正在寻找一个.Net的XML解串器去掉模糊,只是看到一个<obj> <Name> ...并将其数据放入public string Name { get; set; }。它不应该比例如MyObj myObj = SimpleXml.Deserialize<MyObj>(xmlString);更难。非常像JSON解串器工作。

从哪里可以找到像我所描述的易于使用的XML解串器?

我明白这限制了我的XML阅读能力。

+1

你不问一个问题。至于我所关心的问题,你问的问题是:你可以很容易地编写一个扩展方法,它可以完成所有引用的命名空间,然后在将来使用它。 – driis 2013-02-24 09:56:24

+1

我在找东西。如果它需要以问题的形式出现,那么就想象它以“有人知道这件事?”结尾。或者“任何人都可以帮助我?”或者其他任何模糊的弥漫性的,可能错误地陈述的问题。:) – 2013-02-24 10:15:11

+0

我不明白当XmlSerializer.Deserialize失败时扩展方法会如何帮助我。我当然可以写我自己的XML解析器,但我想我会离开这一天。 我的问题的整个观点..错误..声明是找到一个廉价的简单懒惰的方式读取XML数据到模型中。 – 2013-02-24 10:19:18

回答

1

我正在为我的UI客户端使用这种助手。

public string Serialize<T>(T o) 
{ 
    var x = new XDocument(); 
    using(var w = x.CreateWriter()) 
     new XmlSerializer(typeof(T)).Serialize(w, o); 
    return x.ToString(); 
} 

public T Deserialize<T>(string s) 
{ 
    return 
     (T)new XmlSerializer(typeof(T)) 
     .Deserialize(XDocument.Parse(s) 
     .CreateReader()); 
} 

当心,如果你使用的是Windows服务,有系列化已知内存泄漏:http://dotnetcodebox.blogspot.fr/2013/01/xmlserializer-class-may-result-in.html

为了避免这种情况,我建议你创建一个以上方法来代替代码new XmlSerializer /从缓存中检索XmlSerializers(例如字典),如博客文章中所述。

+1

+1为内存泄漏。已经知道它,但这是一个非常重要的事情要注意。 – 2013-02-24 10:41:43

1

通过使用xsd.exe得到了同样的问题,我不想拥有一个巨大的自动生成的文件,我需要修复它才能工作,而且我花了数小时的时间使用反汇编工作,命名空间,等等。

如果您想要一个没有模糊的单线解决方案,请尝试xsd2codehttp://xsd2code.codeplex.com/),它只是起作用。 请注意,您需要阅读关于生成类的小指南,以便在生成之前获取所有设置,您不能只是单击生成,至少对于我来说它没有正确的默认设置,但它很容易设置正确。

所以我做:

  1. 生成具有XSD.EXE(XSD Hoorah.xml)的XSD,XSD.EXE的那部分是好的。
  2. 生成的类与xsd2code(安装并请参阅指南)
  3. 使用随附生成的类从xsd2code

    var hoorah = Hoorah.Deserialize(xml); 
    

的反序列化方法只是工作!