XmlSerializer.Deserialize - игнорировать ненужные элементы? - PullRequest
3 голосов
/ 07 августа 2010

У меня есть схема XSD, в которой я сгенерировал класс для использования xsd.exe, и я пытаюсь использовать XmlSerializer.Deserialize для создания экземпляра этого класса из файла XML, который должен соответствоватьсхема XSD.К сожалению, в файле XML есть некоторые дополнительные элементы, которых схема не ожидает, что приводит к выбрасыванию System.InvalidOperationException из Deserialize.

. Я попытался добавить элементы <xs:any> в мою схему, но это неКажется, нет никакой разницы.

Мой вопрос: есть ли способ заставить XmlSerializer.Deserialize игнорировать эти дополнительные элементы?

Ответы [ 2 ]

5 голосов
/ 17 августа 2010

Я обычно добавляю дополнительные свойства или поля ко всем классам сущностей, чтобы подобрать дополнительные элементы и атрибуты, как в приведенном ниже коде:

[XmlAnyAttribute]
public XmlAttribute[] AnyAttributes;

[XmlAnyElement]
public XmlElement[] AnyElements;

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

Чтобы дать честную атрибуцию, я впервые познакомился с этим шаблоном при чтении исходного кода для DasBlog.

2 голосов
/ 07 августа 2010

Я не думаю, что есть возможность сделать это. Вы должны либо исправить схему, либо вручную изменить код, сгенерированный xsd.exe, чтобы десериализовать XML. Вы также можете попробовать открыть документ XML + схему в Visual Studio или любом другом редакторе XML с поддержкой схемы, чтобы исправить схему или документ XML.

...