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