#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 в ваш конвейер обработки. Аналогичным образом обрабатывайте изменения в выходных форматах на заключительном этапе постобработки в конвейере вывода.