gpt4 book ai didi

c# - 将一部分xml反序列化为类

转载 作者:行者123 更新时间:2023-11-30 17:00:33 25 4
gpt4 key购买 nike

因此,如果我有 3 个不同的文件,其中包含非常长且复杂的 xml(我在此处进行了缩写),但只是根元素名称不同(不是真正随机的,但我不想为相同的 xml 重复类) :

文件 1

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

文件 2

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

文件 3

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

因为 XmlRootAttributeAllowMultiple=false我无法创建单个类来表示以前的 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; }
}

我想我可以偷偷摸摸地捕获我需要的元素并反序列化它:

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);
}

但是这会导致 InvalidOperationException :

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

有内部异常:

<car> was not expected.

这两者似乎都很老套;重命名根元素,然后反序列化 OR 获取元素并在 <?xml> 前添加前缀标签。还有其他建议吗?

最佳答案

您已经提取了 <car>节点,但您仍在从文档的根节点反序列化。这就是为什么异常表明它期待 <car>节点。以下对我有用:

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

反序列化自 <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);
}

关于c# - 将一部分xml反序列化为类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22083548/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com