0

我正在尝试针对 JMeter 中的 xsd 模式验证 xml 响应,但断言总是失败并出现错误

无法将“作业”解析为元素“内容”的类型定义

xml响应是:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<result>
    <state>
        <tag>value</tag>
    </state>
    <content 
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      xsi:type="job">
        <status>ok</status>
    </content>
</result>

架构是:

<xs:schema attributeFormDefault="unqualified" 
           elementFormDefault="qualified" 
           xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="result">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="state">
          <xs:complexType>
            <xs:sequence>
              <xs:element type="xs:string" 
                          name="tag"/>
            </xs:sequence>
          </xs:complexType>
        </xs:element>
        <xs:element name="content">
          <xs:complexType>
            <xs:sequence>
              <xs:element type="xs:string" 
                          name="status"/>
            </xs:sequence>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

我无法修改响应,但我可以更改架构。我该如何解决这个问题?

谢谢 !

4

3 回答 3

2

您应该按如下方式更改您的 XSD:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" attributeFormDefault="unqualified" elementFormDefault="qualified">
  <xs:element name="result">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="state">
          <xs:complexType>
            <xs:sequence>
              <xs:element type="xs:string" name="tag"/>
            </xs:sequence>
          </xs:complexType>
        </xs:element>
        <xs:element name="content" type="content"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>

  <xs:complexType name="content">
  </xs:complexType>

  <xs:complexType name="job">
    <xs:complexContent>
      <xs:extension base="content">
        <xs:sequence>
          <xs:element type="xs:string" name="status"/>
        </xs:sequence>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>

</xs:schema>

属性由xsi:type验证以特殊方式处理,作为用于验证可以具有不同类型形成层次结构的元素的类型的规范。

在上面的固定模式中,我创建了一个简单的层次结构,其中包含一个基本content复杂类型和job一个派生自它的类型。

于 2013-08-01T12:47:25.477 回答
0

您的回复是指定义为 { http://www.w3.org/2001/XMLSchema-instance }:type 的类型属性。它不属于您的架构的命名空间,因此您无法通过更改架构来修复验证。

本质上,响应是错误的(它指的是 w3 模式定义中的未知类型,请参阅此处的 W3 模式定义),因此理想情况下,响应应该是固定的。

评论后编辑

如果您可以更改响应以在响应的同一命名空间中具有 type 属性,例如:

<result xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <state>
        <tag>value</tag>
    </state>
    <content xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" type="job">
        <status>ok</status>
    </content>
</result>

然后它将使用以下 XSD 进行验证:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
    <xs:element name="result">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="state">
                    <xs:complexType>
                        <xs:sequence>
                            <xs:element name="tag" type="xs:string"/>
                        </xs:sequence>
                    </xs:complexType>
                </xs:element>
                <xs:element name="content">
                    <xs:complexType>
                        <xs:sequence>
                            <xs:element name="status" type="xs:string"/>
                        </xs:sequence>
                        <xs:attribute name="type" type="type"/>
                    </xs:complexType>
                </xs:element>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
    <xs:simpleType name="type">
        <xs:restriction base="xs:string"/>
    </xs:simpleType>
</xs:schema>

然后,您可以将类型的限制微调为您想要的任何内容。

于 2013-08-01T09:08:44.317 回答
0

你说你不能修改响应,但你可以。您可以在验证之前对其进行转换。这可能是正确的做法;我不知道,因为我不知道 xsi:type="job" 试图实现什么。

于 2013-08-01T12:48:11.683 回答