XSD验证需要它抱怨的元素

时间:2012-09-12 16:16:01

标签: xml soap xsd soapui xml-validation

我在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中验证原始响应,则在元素根@http://peoplesoft.com/中显示预期元素'ReturnID'而不是'ReturnID @http://peoplesoft.com/rootResponse' rootResponse

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

在这两种情况下,它都在关注 ReturnID 元素,但它说它需要 ReturnID 元素吗?

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)

基本上,xml验证器需要

<德尔> ReturnID

<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",所有内部元素也将采用此命名空间。