【问题标题】:Can't generate correct XSD from XML无法从 XML 生成正确的 XSD
【发布时间】:2021-07-19 22:32:42
【问题描述】:

我已经从 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 中进行哪些更改以使我的测试正常工作?

【问题讨论】:

  • 您的 XML 表明 result 的类型为 saveResponse,但您的 XSD 中没有定义此类类型。你真的想在这里使用xsi:type="saveResponse"吗?您不能只使用验证工具的功能将您的 XML 与 XSD 相关联,或者使用xsi:noNamespaceSchemaLocation吗?

标签: xml validation testing xsd rest-assured


【解决方案1】:

您没有说您使用什么工具来生成 XSD,但它看起来好像没有考虑 xsi:type - 这并不令人惊讶,因为 xsi:type 的存在表明一些相当复杂不易推断的语义。

像这样从一个小的示例文档生成 XSD 是毫无意义的。例如,为 ap_insprem 定义一个 xs:byte 类型是一个非常疯狂的猜测:仅仅因为样本中的值在 xs:byte 的范围内并不意味着它必须在这个范围内才有效。

如果您只想生成此实例符合的模式,则可以将匿名 complexType 替换为名为 saveResponse 的 complexType。但这有点像定义模式,以便“ok”是 ap_result 的唯一允许值。要正确执行此操作,您需要了解文档类型的语义,而这无法从一个示例文档中推断出来。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-19
    • 2010-12-02
    • 2011-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-24
    相关资源
    最近更新 更多