使用通用XML属性进行反序列化

时间:2012-05-29 22:43:42

标签: c# xml xml-serialization

我有一些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>

我可以提供一些我用过的示例代码,但它不起作用,我想要一些新鲜的展望。我正在使用一个由一个类反序列化的xmlReader,该类具有由属性“name”标识的单个属性,这不是我想要的任何方式。我最终想要包含福特,雪佛兰和道奇属性的类模型(如果你在这里反对汽车结构,这是一个组成的例子)。

XSD吐出这样的东西,这是我所期望的,但不是我想要的东西:

[...]
<xs:element name="Column" nillable="true" minOccurs="0" maxOccurs="unbounded">
  <xs:complexType>
    <xs:simpleContent msdata:ColumnName="Column_Text" msdata:Ordinal="1">
      <xs:extension base="xs:string">
        <xs:attribute name="name" type="xs:string" />
      </xs:extension>
    </xs:simpleContent>
  </xs:complexType>
</xs:element>
[...]

我不受这种技术的限制。我正在用C#开发。

感谢任何帮助。

@RichardTowers:我在列出的xml中尝试了以下内容并收到错误“XML文档中存在错误(1,2)。”

Base.Root[] cars = null;
XmlSerializer serializer = new XmlSerializer(typeof(Base.Root[]));
XmlReader reader = XmlReader.Create(new StringReader(xml));
cars = (Base.Root[])serializer.Deserialize(reader);
reader.Close();

我尝试用xmlElementAttribute修饰符更改你建议的类,在xmlString的开头添加“”。我也尝试用StreamReader切换StringReader无济于事。还有其他建议吗?

1 个答案:

答案 0 :(得分:2)

您想要做的并不是反序列化的工作方式。一方面你有一些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;

修改:以下是包含执行此操作所需的所有代码的粘贴:http://pastebin.com/Z3b3558Z。对于缩进,很抱歉,VisualStudio有点兴奋。