Десериализация XML-файлов и извлечение значений по умолчанию из схемы для несуществующих значений.

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

То, что я пытаюсь сделать, это использовать схему для определенного каталога и десериализатор, который мне нужен для загрузки данных из файла XML в мой объект в моем приложении. Однако мне нужно, чтобы десериализатор брал значения по умолчанию из схемы, если элемент не указан в файле XML.

Я обнаружил, что есть способ указать расположение схемы для класса с помощью атрибута [XmlSchemaProviderAttribute("GetSchemaFile")] и статического метода (ref http://msdn.microsoft.com/en-us/magazine/cc300797.aspx). Однако это не сработает для моей текущей ситуации, поскольку у меня есть несколько схем, специфичных для разных файлов.

Кто-нибудь знает способ сделать это? Или я должен попытаться найти альтернативный способ справиться с моей потребностью в значениях по умолчанию?


person Benji Vesterby    schedule 08.08.2012    source источник


Ответы (2)


В каждом файле XML должна быть указана схема, которую он использует. Обычно это делается в корневом элементе.

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

<node name="/org/freedesktop/sample_object" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:noNamespaceSchemaLocation="introspect.xsd">

Вот ссылка с кратким обзором того, как ссылаться на схему.

person David    schedule 08.08.2012
comment
Файлы XML, которые я использую в настоящее время, определяют пространство имен файла схемы, однако файлы XML отправляются нашими клиентами, которые не знают, где на самом деле находится схема для их XML. Приложение отслеживает расположение файла схемы для каждого из наших клиентов. Есть ли способ использовать эту информацию программно и связать ее с сериализатором? - person Benji Vesterby; 09.08.2012
comment
Не могли бы вы предоставить схему через HTML, а затем поделиться списком URL-адресов со своим клиентом, чтобы он мог ссылаться на них? Например: xsi:schemaLocation="http://www.example.org example.xsd - person David; 09.08.2012
comment
Проблема, с которой я столкнулся при выборе этого направления, заключается в том, что некоторые из наших клиентов не желают менять свои инструменты экспорта для использования этого метода. Изменения, которые я делаю, должны быть максимально незаметны для наших клиентов. - person Benji Vesterby; 09.08.2012
comment
На самом деле, у меня просто вспышка мозга. Я думаю, что большинство парсеров проверки XML предоставляют средства для переопределения местоположения схемы, указанного в XML (например, DocumentBuilderFactory в Java). Итак, ознакомьтесь с API для вашего класса парсера, чтобы указать расположение схемы. - person David; 09.08.2012
comment
Этот аналогичный post может быть полезно. - person David; 09.08.2012

Итак, у меня только что была возможность проверить ваше предложение @David об использовании noNamespaceSchemaLocation, и XmlSerializer, похоже, не извлекает никакой информации из схемы, указанной там для значений по умолчанию. Я искал весь день, чтобы найти способ сделать эту работу, отсюда и причина, по которой я опубликовал.

* ИЗМЕНИТЬ *

Просмотрев множество разных сайтов, я обнаружил, что использование метода десериализации C# XML Serializer для извлечения значений по умолчанию из схемы невозможно, если схема должна быть динамической, а это означает, что десериализуемый объект может иметь разные значения по умолчанию в разных схемах.

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

Спасибо @David за предложения. Они очень ценятся.

person Benji Vesterby    schedule 08.08.2012
comment
Решение, которое я использовал, уникально для моей ситуации. В итоге я использовал файл настроек для каждого клиента, который содержал информацию по умолчанию (например, => ClassName, PropertyName, DefaultValue), и использовал отражение, чтобы применить его после десериализации XML в приложении. - person Benji Vesterby; 11.08.2012