Как выполнить сериализацию XML с применением силы, создав все обязательные элементы - PullRequest
1 голос
/ 08 августа 2011

Я сгенерировал cs-классы с помощью xsd-tool из какой-то XML-схемы.Схема представляет собой очень сложную схему, созданную из описаний класса uml.Теперь я написал простой тест для проверки функциональности сгенерированных xsd-классов.Тест использует XmlSerializer для создания xml-файла.

В моей XSD-схеме есть несколько обязательных элементов (определение с minocc=1 и maxocc=1 по xsd-default).

Например (упрощенно):

<xs:element name="order">
    <xs:complexType>
       ...
         <xs:element name="orderId" type="string"/>
         <xs:element name="material" type="Material"/>
       ...
    <xs:complexType>

Материал сложного типа, состоящий из нескольких элементов.Это часть порядка.

Эти элементы должны всегда существовать в результирующем xml-файле, даже если они пусты или содержат только пустые элементы.Теперь, если я сериализую экземпляр класса в xml-файл, появятся только элементы, в которых свойства-свойства содержат значение.Если я устанавливаю orderId, появляется элемент orderId, но не материал-элемент, потому что в моем экземпляре класса он нулевой.В результате мой xml-файл не подходит для xsd-схемы.

У вас есть идея, как я могу проверить полученный xml-файл с моим xsd-файлом во время сериализации?Есть ли способ сказать XmlSerializer, что он всегда должен генерировать обязательные элементы (возможно, со значением по умолчанию)?Или есть способ проверить структуру экземпляра класса, который должен быть сериализован?

1 Ответ

2 голосов
/ 08 августа 2011

Вы не можете автоматически генерировать элементы для выполнения ваших необходимых правил. По второму вопросу вы можете проверить сгенерированный xml с объектами XmlReader и XmlSchema. Небольшой пример будет выглядеть так:

        public IList<string> Validate(TextReader reader, XmlSchema schema)
        {
            XmlReaderSettings settings = new XmlReaderSettings();
            settings.Schemas.Add(schema);
            settings.ValidationType = ValidationType.Schema;

            List<string> errors = new List<string>();

            settings.ValidationEventHandler += (sender, e) =>
            {
                errors.Add(string.Format("Line {0} at position {1}{2}{3}",
                        e.Exception.LineNumber, e.Exception.LinePosition,
                                    Environment.NewLine, e.Message));
            };


            XmlReader xmlReader = XmlReader.Create(reader, settings);
            while (xmlReader.Read()) { };

            return errors;
        } 

Этот пример принимает TextReader (может быть StreamReader, StringReader и т. Д.) И объект XmlSchema (вы можете создать его из файла xsd или любого другого - проверьте документацию для него) и возвращает список ошибок проверки.

...