Проверять (и запрашивать) содержимое XmlElement без OuterXML? - PullRequest
2 голосов
/ 02 февраля 2011

У меня есть веб-метод (в рамках веб-службы SOAP) с сигнатурой:

public msgResponse myWebMethod([XmlAnyElement] XmlElement msgRequest)

Я решил использовать параметр XmlElement после чтения , что позволитмне выполнить собственную проверку XSD для параметра.Проблема в том, что параметр может быть довольно большим (до 80 МБ XML), поэтому вызов XmlElement.OuterXML(), как предлагается в ссылке, не очень практичный метод.

Есть ли другой способ проверки объекта XmlElement по XSD?

В более общем смысле, является ли это неподходящим подходом для реализации веб-службы, ожидающей больших объемов XML?Я сталкивался с некоторыми намеками на использование SoapExtensions для получения доступа к входному потоку напрямую, но не уверен, что это правильный подход для моей ситуации.

Примечание: К сожалению, яприкованный к существующему WSDL и XSD, который я не могу изменить, поэтому я пошел с реализацией без WCF.

1 Ответ

2 голосов
/ 02 февраля 2011

Вот быстрый пример.Просто передайте XmlElement этому методу:

private static void TheAnswer(IXPathNavigable inputElement)
{
    var schemas = new XmlSchemaSet();
    schemas.Add("http://foo.org/importvalidator.xsd",
                @"..\..\validator.xsd");
    var settings = new XmlReaderSettings
                       {
                           Schemas = schemas,
                           ValidationFlags =
                               XmlSchemaValidationFlags.
                                   ProcessIdentityConstraints |
                               XmlSchemaValidationFlags.
                                   ReportValidationWarnings,
                           ValidationType = ValidationType.Schema
                       };
    settings.ValidationEventHandler +=
        (sender, e) =>
        Console.WriteLine("{0}: {1}", e.Severity, e.Message);
    using (
        XmlReader documentReader =
            inputElement.CreateNavigator().ReadSubtree())
    {
        using (
            XmlReader validatingReader = XmlReader.Create(
                documentReader, settings))
        {
            while (validatingReader.Read())
            {
            }
        }
    }
}
...