XML, который я получаю, предоставляется внешним источником, поэтому у меня нет возможности легко переформатировать его. Я хотел бы использовать xml-атрибуты для своих объектов вместо того, чтобы писать запрос linq, который знает, как отформатирован XML и сущность. Вот пример:
<?xml version="1.0"?>
<TERMS>
<TERM>
<ID>2013-2</ID>
<DESC>Spring 2013</DESC>
</TERM>
<TERM>
<ID>2013-3</ID>
<DESC>Summer 2013 Jun&Jul</DESC>
</TERM>
</TERMS>
Я знаю, что XMLSerializer ожидает, например, ArrayOfTerm вместо TERMS, но я могу настроить мою сущность, чтобы использовать другое имя элемента с атрибутами xml, такими как:
public class TermData
{
[XmlArray("TERMS")]
[XmlArrayItem("TERM")]
public List<Term> terms;
}
public class Term
{
[XmlElement("ID")]
public string id;
[XmlElement("DESC")]
public string desc;
}
и я десериализую данные так:
TermData data;
XmlSerializer serializer = new XmlSerializer(typeof(TermData));
using (StringReader reader = new StringReader(xml))
{
data = (TermData)serializer.Deserialize(reader);
}
return View(data.terms);
Проблема, с которой я столкнулась, заключается в том, что ТЕРМИНЫ - это корень и сам массив. Если бы XML должен был иметь корневой элемент, который не был массивом, я мог бы изменить свой класс TermData, как он, и он будет десериализован правильно (уже протестирован).
[XmlRoot("ROOT")]
public class TermData
{
[XmlArray("TERMS")]
[XmlArrayItem("TERM")]
public List<Term> terms;
}
Обратите внимание, что использование TERMS в качестве XMLRoot не работает. Прямо сейчас мой код бросает
InvalidOperationException: There is an error in XML document (2,2).
InnerException: "<TERMS xmlns=" was not expected.
Это заставило бы меня поверить, что XML не отформатирован правильно, но, насколько я понимаю, пример, который я дал, является полностью корректным XML.
Все это было бы тривиально, если бы я мог редактировать исходный xml, но может быть множество других ответов, подобных этому, и мне нужно быть в состоянии сгибать все, что бы я мог получить. Я пытаюсь подтвердить, поддерживает ли XMLSerializer этот тип структуры XML. Я тестировал почти все и не могу получить десериализацию без редактирования XML. Было бы также удобно, если бы мне не пришлось определять класс-оболочку (TermData) для хранения списка, но это, похоже, работает только в том случае, если xml следует за соглашениями об именах для сериализатора (ArrayOfTerm и т.д.).