Способ сериализации / десериализации XSD с пространствами имен разных версий?

#c# #xml #xsd

#c# #xml #xsd

Вопрос:

Есть ли какой-либо способ разрешить сериализацию / десериализацию в XML с предпочтительным пространством имен и использовать альтернативу в случае сбоя?

Чтобы быть более конкретным, у меня есть XSD, определенный с сегментами, как показано ниже…

 <xs:schema targetNamespace="http://www.PrimaryNameSpaceV2.com"
   xmlns="http://www.PrimaryNameSpaceV2.com"
   xmlns:xs="http://www.w3.org/2001/XMLSchema"
   xmlns:xsi ="http://www.w3.org/2001/XMLSchema-instance"
   elementFormDefault="qualified"
   attributeFormDefault="unqualified">
  

Он сгенерировал для меня определения классов, которые содержат следующее…

 [System.SerializableAttribute()]
[System.Xml.Serialization.XmlTypeAttribute("MyObject", Namespace="http://www.PrimaryNameSpaceV2", AnonymousType=true)]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlRootAttribute("MyObject", Namespace="http://www.PrimaryNameSpaceV2")]
  

Теперь у меня нет проблем при сериализации данных, которые поступают с заголовком, содержащим следующее

 <xmlns="http://www.PrimaryNameSpaceV2.com">
  

Это неудивительно. Однако я получаю ошибки из-за неожиданного содержимого, когда пространство имен имеет предыдущую версию. Это также не удивительно для меня, поскольку очевидно, что пространства имен разные. V2 против V1.

 <xmlns="http://www.PrimaryNameSpaceV1.com">
  

Я хотел бы иметь возможность сериализовать и десериализовать с помощью PrimaryNameSpaceV2, а если PrimaryNameSpaceV2 не удается, попробуйте с помощью PrimaryNameSpaceV1. Но я не совсем уверен, есть ли какой-либо способ сделать это, кроме создания совершенно нового xsd, а также целого нового набора определений классов. Нет ли краткого способа поддержки обеих версий этих пространств имен?
Прошу прощения, если есть какая-то базовая информация о версиях, которая поддерживает это, но у меня возникли проблемы с поиском каких-либо ресурсов для такой операции.

Комментарии:

1. Вы можете использовать xml linq. Вы можете получить пространство имен по умолчанию, используя XDocument doc = XDocument . Загрузка (имя файла); XElement root = doc.Root; XNamespace ns = root. GetDefaultNameSpace();

Ответ №1:

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