Member 2127939 Ответов: 1

C# десериализует XML в коллекцию с уникальным ключом, где ключ берется из атрибута XML " id”


Приведенный ниже код в настоящее время работает и загружает XML в структуру класса. Эта структура состоит из коллекции элементов (items), каждый из которых имеет фиксированные свойства, и коллекции, которую я использую для переменного числа свойств.

Две вещи, которые я хочу сделать: 1) я хочу изменить список на что-то, что имеет уникальный ключ. Я попробовал словарь, но он не сработал, может быть, хэш-набор...2) ключ для коллекции должен управляться XML-атрибутом элемента "id".

Я не могу до конца понять это, и попытка скопировать шаблон KVP, который я использовал для переменных параметров элементов, не работает. Он добавляет элементы в "элементы", но все они пусты, и хэш для коллекции не заполняется.

Помогите пожалуйста

ПС. Похоже пометки разделов текста как C# и XML не работает.

[XmlRoot ("ItemsContainer")]
элементы публичного класса
{
[XmlAttribute ("Версия")]
public string Version { get; set; }

[XmlArray ("Items")]
[XmlArrayItem ("Item")]
public List & lt;item> items = new List< item> (); / / TODO-ключ в этой коллекции должен быть уникальным и управляться из XML-атрибута элемента "Id"

общественности статической нагрузки элементы(строку пути)
{
var xml = ресурсы.Загрузить & lt;textasset> (путь);
ВАР сериализатор = новый сериализатор XmlSerializer(typeof на (пункты));
var reader = новый StringReader(xml. text);
var items = (Items) сериализатор.Десериализация (читатель);
читатель.Закрывать();
возврат товаров;
}
}


предмет открытого класса
{
// # # # Фиксированные Параметры Элемента
[XmlAttribute ("Id")]
public int Id { get; set; }

[XmlElement ("Имя")]
public string Name { get; set; }

[XmlElement ("Описание")]
публичное строковое описание { get; set; }

[XmlElement ("Значение")]
public float Value { get; set; }

// # # # Переменные параметры элемента как пары ключевых значений.
[XmlArray ("KVPS")]
[XmlArrayItem ("KVP")]
общественная список<KeyValuePair&ЛТ;строку, строку&ГТ;&ГТ; KVPS { получить; набор; } //мы будем иметь случаев мы не хотим, чтобы уникальные ключи
}

[Упорядочиваемый]
публичный класс KVP< K, V>
{
открытый ключ K { get; set; }
public V Value { get; set; }

общественный КВП()
{
}

открытый KVP(K ключ, V значение)
{
Ключ = ключ;
Value = значение;
}
}



Вот связанный XML

& lt;?xml version=" 1.0 "encoding=" utf-8"?>

<ItemsContainer Version= "1.0">
< предметы>

< Item Id= "100">
<имя & gt;Бургер
< описание & gt;прекрасный дегустационный Биг-Мак
< значение> 5.67


< Item Id= "101">
< имя & gt;Саммич
< описание & gt;ветчина и сыр
< значение & gt;2.80


< Item Id= "102">
< имя & gt;Карлинг
< описание> Пинта карлинга
< значение & gt;2.80
< kvps>
< kvp>
< ключ & gt;alchohol
& lt;значение> 3.9

< kvp>
< ключ & gt;alchohol
& lt;значение> 4.9

< kvp>
< ключ & gt;alchohol
& lt;значение> 5.9

Что я уже пробовал:

Я не могу до конца понять это, и попытка скопировать шаблон KVP, который я использовал для переменных параметров элементов, не работает. Он добавляет элементы в "элементы", но все они пусты, и хэш для коллекции не заполняется.

1 Ответов

Рейтинг:
0

Richard Deeming

Предполагая, что элементы в вашем XML-файле на самом деле заключены правильно, а отсутствующие закрывающие элементы присутствуют, вам просто нужно изменить тип вашего XML-файла. KVPS собственность от:

List<KeyValuePair<string, string>>
к
List<KVP<string, string>>

В настоящее время вы используете встроенный System.Collections.Generic.KeyValuePair<TKey, TValue> тип, в котором не определен конструктор по умолчанию. Если вы переключитесь на использование пользовательского типа, десериализация будет работать так, как ожидалось.