【问题标题】:Is it legal to use anyType with an undefined XML namespace?将 anyType 与未定义的 XML 命名空间一起使用是否合法?
【发布时间】:2018-03-20 11:36:54
【问题描述】:

我们使用 GSoap 发送 SOAP 请求并处理响应。但是,我们遇到了一个问题,因为远程服务器使用包含以下内容的 XML 进行回复:

ax21 命名空间和 xsi 命名空间在上面的一个元素中定义,这很好(并且 xsi 是“标准”xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance ”)。然而,axis2ns9259 命名空间是未知的(据我所知——文档中没有提到它)。 GSoap 不喜欢它,并以错误退出,告诉我们类型不匹配。

然而,阅读 XML 规范,似乎“anyType”类型存在于所有命名空间中(事实上,它是该命名空间类型层次结构的“根”,即 ur-type)。此类型接受 ANYTHING(任意数量的元素和/或属性)

所以,我想知道:GSoap 是不是太“严格”了,还是服务器应该已经定义了这个命名空间,即使我们应该能够知道这个类型是什么?

我们不知道我们是否应该“更正”我们的代码(也就是说,可能是屠夫 GSoap 以便它接受这个),或者责怪服务器发送不正确的 XML(格式良好,但无效 - 事实上,它们甚至不提供 XSD 或 DTD)

【问题讨论】:

    标签: xml


    【解决方案1】:

    这不是架构有效的。规则在 XML Schema 1.0 第 1 部分 §3.3.4 中:

    4 如果元素之间存在属性信息项 信息项的 [属性],其 [命名空间名称] 与 http://www.w3.org/2001/XMLSchema-instance 并且其 [本地名称] 是 类型,则以下所有条件都必须为真:

    4.1 相对于内置 QName 简单类型,该属性信息项的·规范化值·必须是·有效的,定义为 字符串有效 (§3.14.4);

    在您的示例中,xsi:type 不是有效的 QName,因为尚未声明前缀。

    (我似乎记得过去在使用 Axis 生成的命名空间时遇到过很多麻烦。)

    【讨论】:

    • 请注意,我们不是在 XML Schema 定义的上下文中,而是在格式良好但不是“有效”的 XML 文档的上下文中,因为它没有指定一个 DTD 或 XSD 来验证它。你的答案是真的“无处不在”吗?您参考的文档专门描述了 XML Schema 规则,所以我仍然有疑问。
    • 正如我所说,根据 XML Schema 规范的规则,该文档是无效的。无论是否存在模式都是如此。但当然,只有在您使用关心模式有效性的应用程序时,它才有意义。
    • 感谢您的澄清。但是,我已经更新了我的问题,因为我认为您的答案可能取决于我没有提到 xsi 命名空间(已正确定义为其“常规”值:xmlns:xsi="w3.org/2001/XMLSchema-instance")
    • 我们认为问题出在该元素中声明的类型(即“axis2ns9259:anyType”)。 XML 处理器是否应该假设“:anyType”表示“任何事情发生”(即使没有声明该命名空间),还是应该首先检查“”是否存在,并且只有在命名空间存在,参考规则说,在任何命名空间中,“anyType”类型是所有类型的“祖先”,授权任何东西(但是,如果没有定义命名空间,则报错)?
    • 在不知道它所在的命名空间的情况下,像“anyType”这样的本地名称是没有意义的。除非您知道命名空间,否则永远不应该解释本地名称。
    猜你喜欢
    • 2014-10-13
    • 1970-01-01
    • 2011-12-23
    • 1970-01-01
    • 2012-01-11
    • 2016-09-14
    • 2021-08-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多