Запутался насчет XmlSerializer + schemaLocation - PullRequest
1 голос
/ 08 ноября 2011

У меня проблемы с проверкой сериализованных данных.

Хорошо, я начал с файла XSD, который я получил от какой-то третьей стороны. Сгенерированные классы C # с использованием инструмента xsd. Затем я добавил

[XmlAttribute("noNamespaceSchemaLocation", Namespace = System.Xml.Schema.XmlSchema.InstanceNamespace)]
public string SchemaLocation = "http://localhost/schemas/AP_Transactions_10052011.xsd";

к объекту верхнего уровня. Этот URL-адрес, очевидно, доступен с моей машины, на которой я запускаю код. Затем я сериализую его, используя XmlSerializer, который правильно выдает

<?xml version="1.0" encoding="utf-8"?>
<BU_AP_Vendor_Invoices xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xsi:noNamespaceSchemaLocation="http://local.com/schemas/AP_Transactions_10052011.xsd">
...
</BU_AP_Vendor_Invoices>

Пока все хорошо. Сейчас я пытаюсь проверить файл так:

public static void Validate(TextReader xmlData)
{
    XmlReaderSettings settings = new XmlReaderSettings();
    settings.ValidationType = ValidationType.Schema;
    settings.ValidationFlags = XmlSchemaValidationFlags.ProcessIdentityConstraints | XmlSchemaValidationFlags.ReportValidationWarnings;
    settings.ValidationEventHandler += delegate(object sender, ValidationEventArgs args)
    {
        Console.WriteLine(args.Message);
    };

    using (XmlReader xmlReader = XmlReader.Create(xmlData, settings))
        while (xmlReader.Read()) ;
}

Что выдает Could not find schema information for the element 'element name' предупреждений для каждого элемента в файле XML. Я предполагаю, что это означает, что XSD просто не загружается.

Я смотрел на XmlReaderSettings.Schemas, но как бы читатель узнал, что там добавить? Я предполагал, что если я не добавлю схемы явно, волшебство просто произойдет, но это, похоже, не сработает.

Вопрос, как это сделать правильно?

1 Ответ

0 голосов
/ 09 ноября 2011

Пожалуйста, посмотрите на это сообщение ; Суть в том, чтобы использовать XmlSchemaValidationFlags.ProcessSchemaLocation.

...