我有一些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无济于事。还有其他建议吗?
答案 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有点兴奋。