Deserialize XML Array, где Root - это массив и элементы, не соответствующие соглашениям - программирование
Подтвердить что ты не робот

Deserialize XML Array, где Root - это массив и элементы, не соответствующие соглашениям

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&amp;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 и т.д.).

4b9b3361

Ответ 1

Возможно, вы можете попробовать:

[XmlRoot("TERMS")]
public class TermData
{
    public TermData()
     {
       terms = new List<Term>();
     }

    [XmlElement("TERM")]
    public List<Term> terms{get;set;}
}

public class Term
{
    [XmlElement("ID")]
    public string id{get;set;}

    [XmlElement("DESC")]
    public string desc{get;set;}
}

Надеюсь, это поможет,