【问题标题】:Validate (and Query) XmlElement Content without OuterXML?验证(和查询)没有 OuterXML 的 XmlElement 内容?
【发布时间】:2011-06-19 14:18:10
【问题描述】:

我有一个带有以下签名的 Web 方法(在 SOAP Web 服务中):

public msgResponse myWebMethod([XmlAnyElement] XmlElement msgRequest)

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

还有其他方法可以针对 XSD 验证 XmlElement 对象吗?

更一般地说,对于实现需要大量 XML 的 Web 服务来说,这是一种不合适的方法吗?我在使用 SoapExtensions 直接访问输入流时遇到了一些提示,但我不确定这是否适合我的情况。

注意:不幸的是,我被链接到了现有的 WSDL 和 XSD,我无权更改,这就是我选择非 WCF 实现的原因。

【问题讨论】:

  • 为什么现有的 WSDL 和 XSD 会阻止您使用 WCF?
  • 有人告诉我 WCF 不能使用现有的 Wsdl。

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


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2013-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-19
    • 1970-01-01
    • 1970-01-01
    • 2013-05-07
    • 1970-01-01
    相关资源
    最近更新 更多