我已经从xml响应生成了一些xsd模式来运行我的响应模式验证测试。
当我试图运行响应模式验证测试时出现错误消息:
org.xml.sax.SAXParseException:cvc elt.4.2:无法将"saveResponse"解析为元素"result"的类型定义。
XML模式:
<?xml version="1.0" encoding="UTF-8"?>
<result xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="saveResponse">
<ap_result>ok</ap_result>
<code>SUCCESS</code>
<ap_contractNumber>Z6922/240/B0004163/1_TEST</ap_number>
<ap_insprem>100</ap_insprem>
<ap_inssum>100000</ap_inssum>
</result>
我生成的XSD架构:
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="result">
<xs:complexType>
<xs:sequence>
<xs:element type="xs:string" name="ap_result"/>
<xs:element type="xs:string" name="code"/>
<xs:element type="xs:string" name="ap_number"/>
<xs:element type="xs:byte" name="ap_insprem"/>
<xs:element type="xs:int" name="ap_inssum"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
我应该在XSD中更改什么以使我的测试工作?
您还没有说明您使用了什么工具来生成XSD,但它看起来似乎没有考虑xsi:type——这并不令人惊讶,因为xsi:ttype的存在表明了一些相当复杂的语义,这些语义很难推断。
从这样的一个小样本文档中生成XSD是毫无意义的。例如,为ap_insprem定义一个xs:byte类型是一个非常疯狂的猜测:仅仅因为样本中的值在xs:byte的范围内并不意味着它必须在这个范围内才能有效。
如果您只想生成一个该实例符合的架构,那么您可以将匿名complexType替换为名为saveResponse的complexType。但这将有点像定义模式;ok";是ap_result的唯一允许值。要正确地做到这一点,您需要理解文档类型的语义,这是无法从一个示例文档中推断出来的。