在没有OuterXML的情况下验证(和查询)XmlElement内容?

时间:2011-02-01 21:52:17

标签: c# asp.net xml web-services

我有一个Web方法(在SOAP Web服务中),签名为:

public msgResponse myWebMethod([XmlAnyElement] XmlElement msgRequest)

我选择在reading之后使用XmlElement参数,它允许我对参数执行我自己的 XSD验证。问题是该参数可能非常(最多80Mb的XML),因此按照链接中的建议调用XmlElement.OuterXML()并不是一个非常实用的方法。

是否有其他方法可以针对XSD验证XmlElement对象?

更一般地说,对于实现期望大量XML的Web服务,这是不恰当的方法吗?我已经看到使用SoapExtensions获得直接访问输入流的一些提示,但我不确定这是否适合我的情况。

注意:不幸的是,我被链接到现有的WSDL和XSD,我无权改变这就是为什么我首先使用非WCF实现。

1 个答案:

答案 0 :(得分:2)

这是一个简单的例子。只需将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())
            {
            }
        }
    }
}