反序列化为XML类的一部分 [英] Deserialize a portion of xml into classes

查看:146
本文介绍了反序列化为XML类的一部分的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

所以,如果我有一个含有极其漫长而复杂的XML(我在这里略)3个不同的文件,但只是根元素名称是不同的(不是真正随机的,但我宁愿不重复类相同的XML) :



文件1

 < XML版本=1.0 >?; 
< somerootname1>
<汽车>
<&做出GT;本田< /让>
<模型>公民< /型号:GT;
< /汽车>
< / somerootname1>



文件2



 <?XML版本=1.0>?; 
< somerootname2>
<汽车>
<&做出GT;本田< /让>
<模型>公民< /型号:GT;
< /汽车>
< / somerootname2>



文件3



 <?XML版本=1.0>?; 
< somerootname3>
<汽车>
<&做出GT;本田< /让>
<模型>公民< /型号:GT;
< /汽车>
< / somerootname3>

由于的 XmlRootAttribute 具有的AllowMultiple = FALSE 我可以' ŧ创建一个类来表示以前的XML。




复制'XmlRootAttribute'属性。




  [XmlRoot(的ElementName =somerootname1)] 
[XmlRoot(的ElementName =somerootname2)]
公共类根
{
公共汽车{搞定;组; }

}

公共类汽车
{
公共字符串使{搞定;组; }
公共字符串模式{搞定;组; }
}



我想我也许能偷偷摸摸抢刚刚元素我需要和反序列化:

  XDOC VAR = XDocument.Parse(将myfile.xml); 

VAR XCAR = xDoc.Root.Descendants()
.FirstOrDefault(D => d.Name.LocalName.Equals(汽车))

VAR串行使用=新的XmlSerializer(typeof运算(汽车))
(VAR读卡器= xml.CreateReader())
{
结果=(汽车)serializer.Deserialize(读卡器);
}



不过的结果在出现InvalidOperationException




有是XML文档中出现错误(0,0)




随着的InnerException:




<汽车> 。预计不会




看来真的哈克要么;重命名根元素,然后反序列化的的采取元素和前缀的< XML> 标记。 ?任何其他建议


解决方案

您已经提取<车> 节点,但你仍然可以从文档的根节点反序列化。这就是为什么除了表明,它期待<汽车> 节点。对我来说,以下工作:

  [XmlRoot(汽车)] 
公共类汽车
{
[的XmlElement(使)]
公共字符串制作{搞定;组; }
[的XmlElement(模特)]
公共字符串模式{搞定;组; }
}



<反序列化;车>

  VAR XCAR = xDoc.Root.Descendants()
.FirstOrDefault(D => d.Name.LocalName.Equals(汽车));

无功序列化=新的XmlSerializer(typeof运算(汽车));使用(VAR读卡器= xCar.CreateReader())
{
VAR的结果=(汽车)serializer.Deserialize(阅读器)
;
Console.WriteLine(result.Make);
Console.WriteLine(result.Model);
}


So if I have 3 different files that contain extremely long and complex xml (which i've abbreviated here) but just the root element name is different (not really random but I'd rather not duplicate classes for the same xml):

File 1

<?xml version="1.0"?>
<somerootname1>
  <car>
    <make>honda</make>
    <model>civic</model>
  </car>
</somerootname1>

File 2

<?xml version="1.0"?>
<somerootname2>
  <car>
    <make>honda</make>
    <model>civic</model>
  </car>
</somerootname2>

File 3

<?xml version="1.0"?>
<somerootname3>
  <car>
    <make>honda</make>
    <model>civic</model>
  </car>
</somerootname3>

Because XmlRootAttribute has AllowMultiple=false I can't create a single class to represent the previous xml.

Duplicate 'XmlRootAttribute' attribute

[XmlRoot(ElementName="somerootname1")]
[XmlRoot(ElementName="somerootname2")]
public class Root
{
  public Automobile Car { get; set; }

}

public class Automobile 
{
  public string Make { get; set; }
  public string Model { get; set; }
}

I thought I might be able to be sneaky and grab just the element I need and deserialize it:

var xDoc = XDocument.Parse("myfile.xml");

var xCar = xDoc.Root.Descendants()
  .FirstOrDefault(d => d.Name.LocalName.Equals("car"))

var serializer = new XmlSerializer(typeof(Automobile))
using (var reader = xml.CreateReader())
{
  result = (Automobile)serializer.Deserialize(reader);
}

However that results in an InvalidOperationException:

There is an error in XML document (0, 0).

With an InnerException:

<car> was not expected.

It seems really hacky to either; rename the root element and then deserialize OR take the element and prefix the <?xml> tag. Any other suggestions?

解决方案

You have extracted the <car> node, but you're still deserializing from the document's root node. That's why the exception suggests that it's expecting the <car> node. The following works for me:

[XmlRoot("car")]
public class Automobile
{
    [XmlElement("make")]
    public string Make { get; set; }
    [XmlElement("model")]
    public string Model { get; set; }
}

Deserialize from <car>:

var xCar = xDoc.Root.Descendants()
    .FirstOrDefault(d => d.Name.LocalName.Equals("car"));

var serializer = new XmlSerializer(typeof(Automobile));
using (var reader = xCar.CreateReader())
{
    var result = (Automobile)serializer.Deserialize(reader);
    Console.WriteLine(result.Make);
    Console.WriteLine(result.Model);
}

这篇关于反序列化为XML类的一部分的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆