2012-05-29 7 views
1

У меня есть xml, который снабжен универсальными атрибутами (имя, тип и т. Д.), Где значение атрибута должно быть свойством, в которое дескрипциализируется xml.Deserializing с общими атрибутами 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> 

Я могу предоставить некоторые примеры кода я использовал, но он не работает, и я d как некоторые свежие перспективы. Я использовал xmlReader, десериализованный классом, который имел одно свойство, идентифицированное атрибутом «имя», которое не так, как я хочу. В конечном итоге я хочу, чтобы модели классов, которые содержат свойства Ford, Chevy и Dodge (это составленный пример, если вы возражаете против структуры автомобиля здесь).

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. Я также попытался отключить StringReader с StreamReader безрезультатно. Любые другие предложения?

+0

Является ли формат XML под вашим контролем или вы используете XML из внешнего источника? – gilly3

+0

xml полностью вышел из-под контроля. – John

+0

Я добавил пастебин с примером того, как вы можете это сделать. Вы заметите, что это немного кошмар. Это связано с тем, что ваш XML не похож на данные, которые вы хотите представить. – RichardTowers

ответ

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; 

Edit: Вот паста со всем кодом, необходимым для этого: http://pastebin.com/Z3b3558Z. Извините за отступ, VisualStudio немного взволнован.

+0

Я ценю это. Я хочу сказать, что я хочу сделать сериализацию этих данных в классе. Я полностью понимаю, что вы имеете в виду, если элемент добавляется.Существует большое количество этих элементов столбца, и они не будут меняться, но эти имена столбцов в моем сценарии могут быть списком птиц в следующий раунд, для другого вызова, и я создам для него собственный класс также. Я бы хотел, чтобы более общий средний человек загружал xml в классы, даже если классы тесно связаны. Я бы предпочел, чтобы мой код ожидал такой элемент, как пример linq. – John

+1

Ну, вы можете * десериализовать XML, как я описал выше, а затем добавить еще один класс, который обертывает код Find в моем примере (который не является linq by by). – RichardTowers

+0

Спасибо за ваш ответ. Я обновил свой вопрос, чтобы включить некоторые вещи, которые я пробовал вместе с вашим предложением. Если бы вы могли взглянуть, я был бы признателен. – John

Смежные вопросы