4

我在 SOAP 响应验证上遇到了一个奇怪的问题。我已经将响应和 XSD 降低到重现错误所需的最低限度。XSD:

<?xml version="1.0"?>
<xs:schema targetNamespace="http://peoplesoft.com/rootResponse" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="root">
    <xs:complexType>
      <xs:sequence>
        <xs:element maxOccurs="unbounded" name="ReturnID" />
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

SOAP 响应:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <soapenv:Body>
    <root xmlns="http://peoplesoft.com/rootResponse">
      <ReturnID />
    </root>
  </soapenv:Body>
</soapenv:Envelope>

如果我在 soapUI 中验证原始响应,它会在元素 root@http://peoplesoft.com/rootResponse 中显示预期元素“ReturnID”而不是“ReturnID@http://peoplesoft.com/rootResponse”

当我在 Visual Studio 2012 中加载上述文件时(是的,我确实告诉 Visual Studio 使用此 XSD 文件来验证命名空间),我得到这个:命名空间'http://peoplesoft.com/rootResponse 中的元素'root' ' 在命名空间 'http://peoplesoft.com/rootResponse' 中有无效的子元素 'ReturnID'。预期的可能元素列表:'ReturnID'。

在这两种情况下,它都会对ReturnID元素大喊大叫,但它说它需要ReturnID元素?

4

2 回答 2

3

除非您正在处理非常不寻常的实例文档,否则您的 xs:schema 元素应该带有属性elementFormDefault="qualified"。如果没有这个,本地元素声明(例如 ReturnID 的声明)将引用非命名空间中的元素,而不是目标命名空间中的元素。

于 2012-09-12T17:49:58.547 回答
1

基本上,xml验证器想要

返回ID

<ReturnID xmlns="http://peoplesoft.com/rootResponse" />

成为

ReturnID xmlns="http://peoplesoft.com/rootResponse"

<ReturnID />

更改文档如下:

<ps:root xmlns:ps="http://peoplesoft.com/rootResponse">
  <ReturnID />
</ps:root>

编辑 原因是通过root xmlns="http://peoplesoft.com/rootResponse"在您的文档上指定,所有内部元素也将采用此命名空间。

于 2012-09-12T16:24:31.343 回答