由于xmlns:xsi =“...”和xsi:type =“...”在元素上无法对模式验证xml

时间:2013-08-01 08:15:24

标签: xml namespaces xsd

我正在尝试在JMeter中针对xsd架构验证xml响应,但断言始终失败并显示错误

  

无法将'job'解析为元素'content'的类型定义

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>

我无法修改响应,但我可以更改架构。我怎么能解决这个问题?

谢谢!

3 个答案:

答案 0 :(得分: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从中派生出来。

答案 1 :(得分:0)

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

本质上,响应是错误的(它指的是w3架构定义See the W3 schema definition here中的未知类型),因此理想情况下应该修复响应。

在评论后修改

如果您可以更改您的响应以在响应的同一名称空间中具有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>

然后,您可以根据需要对类型的限制进行微调。

答案 2 :(得分:0)

你说你无法修改响应,但你可以。您可以在验证之前完成转换。这可能是正确的做法;我无法分辨,因为我不知道xsi:type =“job”正试图实现什么。