C# 使用通用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"> &

我有一些xml提供了通用属性(名称、类型等),其中属性的值需要是xml反序列化到的属性

我试图推送到类上的xml类型示例如下:

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