2010-05-12 2 views
3

Я пытаюсь десериализации XML, который приходит из веб-службы, но я не знаю, как сказать сериалайзер, как handlke этот кусок XML:Вопрос XML десериализации в .net

<Movimientos> 
<Movimientos> 
<NOM_ASOC>pI22E7P30KWB9KeUnI+JlMRBr7biS0JOJKo1JLJCy2ucI7n3MTFWkY5DhHyoPrWs</NOM_ASOC> 
<FEC1>RZq60KwjWAYPG269X4r9lRZrjbQo8eRqIOmE8qa5p/0=</FEC1> 
<IDENT_CLIE>IYbofEiD+wOCJ+ujYTUxgsWJTnGfVU+jcQyhzgQralM=</IDENT_CLIE> 
</Movimientos> 
<Movimientos> 

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

+0

Является ли этот последний (не закрывающий) тег опечаткой, или служба действительно возвращает недействительный xml? –

+0

Что вам нужно делать с этими данными? Вам действительно нужно сериализовать это в пользовательское дерево объектов или вы можете просто использовать классы XDocument и LINQ для получения данных, что было бы намного проще? –

ответ

5

Сериализатор должен быть в порядке с ним - проблема, вероятно, в том, что класс не может иметь свойство, имя которого совпадает с самим классом. Поэтому использовать XmlElementAttribute, чтобы соответствовать его:

[XmlRoot("Movimientos")] 
public class Movimientos 
{ 
    [XmlElement("Movimientos")] 
    public SomeOtherClass SomeOtherProperty { get; set; } 
} 

public class SomeOtherClass 
{ 
    public string NOM_ASOC { get; set; } 
    public string FEC1 { get; set; } 
    public string IDENT_CLIE { get; set; } 
} 

FYI, то XML на самом деле не является неправильным; в спецификации нет правила о том, что дочерний элемент не может иметь то же имя, что и его родительский элемент. Это необычно, но все же справедливо.

+0

Я бы не сказал, что это необычно или необычно. Если вы определяете структуру меню или другие иерархические списки (организационная диаграмма), у вас будет множество дочерних родительских элементов одного и того же имени узла. – CaffGeek

+0

@Chad: Обычно вам не следует, по крайней мере, не в .NET. Родительский класс будет иметь уникальное имя, а имя дочернего объекта будет множественным. Это может быть только однобуквенная разница, но это все, что нужно. Если есть вложенная связь 1: 1, тогда соглашение должно использовать префикс «Внутренний» или «Ребенок». Не предполагать, что каждый другой путь неправильный, но если вы столкнулись с конфликтами имен, тогда самое время начать думать о другом соглашении об именах. – Aaronaught

+0

Это не обязательно столкновение. В случае меню каждый узел является объектом одного и того же типа и может бесконечно переписываться. – CaffGeek

0

Если это не десериализуется XML-сериализатором .Net, вероятно, лучше написать собственный класс для его анализа. Вы можете использовать пространства имен System.Xml или System.Xml.Linq (проще).

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