C# 使用通用XML属性反序列化
我有一些xml提供了通用属性(名称、类型等),其中属性的值需要是xml反序列化到的属性 我试图推送到类上的xml类型示例如下:C# 使用通用XML属性反序列化,c#,xml,xml-serialization,C#,Xml,Xml Serialization,我有一些xml提供了通用属性(名称、类型等),其中属性的值需要是xml反序列化到的属性 我试图推送到类上的xml类型示例如下: <root> <company> <location>USA</location> <name>TopCars</name> </company> <CarList name="CarCounts"> &
<root>
<company>
<location>USA</location>
<name>TopCars</name>
</company>
<CarList name="CarCounts">
<ModelList name="Models">
<Column name="Ford">50</Column>
<Column name="Chevy">65</Column>
<Column name="Dodge">75</Column>
</ModelList>
</CarList>
</root>
我尝试过用xmlElementAttribute decorators更改您建议的类,将“”添加到xmlString的开头。我也尝试过用StreamReader替换StringReader,但没有效果。还有其他建议吗?您想要做的不是反序列化的工作方式。一方面是XML,另一方面是C#类。它们需要彼此相似,序列化程序才能完成其工作 你说你想要一门课,比如:
class Models
{
int Chevy { get; set; } //65
int Dodge { get; set; } //75
}
首先,我认为不可能将XML序列化为这样的内容。但即使是这样,如果XML中有Mercedes
,会发生什么呢?您不能反序列化该位,因为它不在您的类中
基本上,类需要模仿XML。你想要的是:
class Root
{
Company Company { get; set; }
List<Model> ModelList { get; set; }
}
class Company
{
string Location { get; set; }
string Name { get; set; }
}
class Model
{
string Name { get; set; }
int Value { get; set; }
}
// Get the value for Chevy:
root.ModelList.Find(model => model.Name == "Chevy").Value;
编辑:这里有一个粘贴,其中包含执行此操作所需的所有代码:。很抱歉出现缩进,VisualStudio有点激动。XML格式在您的控制范围内,还是您正在使用来自外部源的XML?XML完全不在我的控制范围内。我添加了一个粘贴库,其中包含一个示例,说明了如何执行此操作。你会注意到这有点像噩梦。这是因为您的XML看起来不像您想要表示的数据。我很感激。粗略地说,我想做的是将这些数据序列化到一个类中。我完全理解你的意思,如果添加了一个元素。有大量的这些列元素,它们不会改变,但在我的场景中,这些列名可能是下一次调用的鸟类列表,对于不同的调用,我还将为其创建一个自定义类。我希望有一个更通用的中间人将xml加载到类中,即使这些类是紧密耦合的。我宁愿这样,也不要让我的代码期望像linq示例那样的元素。您可以像我上面描述的那样反序列化XML,然后在我的示例中使用另一个类包装Find代码(顺便说一句,它不是linq)。谢谢您的回复。我已经更新了我的问题,加入了一些我曾经尝试过的东西以及你最初的建议。如果你能看一看,我会很感激的。我终于重新讨论了这个问题,我已经看了你的代码。你说得对,我想用不同于xml字符串中存在的xml元素的方式来表示它,所以我认为这是最好的。感谢您的关注和回应。
class Root
{
Company Company { get; set; }
List<Model> ModelList { get; set; }
}
class Company
{
string Location { get; set; }
string Name { get; set; }
}
class Model
{
string Name { get; set; }
int Value { get; set; }
}
// Get the value for Chevy:
root.ModelList.Find(model => model.Name == "Chevy").Value;