1

我有一些带有通用属性(名称、类型等)的 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,该类具有由属性“名称”标识的单个属性,这无论如何都不是我想要的。我最终想要包含福特、雪佛兰和道奇属性的类模型(如果您反对此处的汽车结构,这是一个虚构的示例)。

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 无济于事。还有其他建议吗?

4

1 回答 1

2

你想要做的并不是反序列化是如何工作的。一方面你有一些 XML,另一方面有一个 C# 类。它们需要看起来彼此相似,序列化程序才能完成其工作。

你说你想要一个像这样的课程:

class Models
{
    int Chevy { get; set; } //65
    int Dodge { get; set; } //75
}

首先,我认为不可能将您的 XML 序列化成这样的东西。但即使是这样,如果您的 XMLMercedes代替了会发生什么?您无法反序列化该位,因为它不在您的班级中。

基本上你的类需要模仿你的 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 有点兴奋。

于 2012-05-29T23:10:41.783 回答