XSD XML-使用限制时出现验证错误

  • 本文关键字:验证 错误 XML- XSD xml xsd
  • 更新时间 :
  • 英文 :


我有两个有效的XSD文件(a.XSD和b.XSD)。我试图根据Schema验证一个XML文件(example.XML),但得到一个错误。

有人能向我解释一下为什么我会出现验证错误吗?

THX


a.xsd

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema targetNamespace="http://namespace/a" xmlns:a="http://namespace/a" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:complexType name="A">
    <xs:sequence>
      <xs:element name="E1" type="xs:token" form="unqualified"/>
      <xs:element name="E2" type="xs:token" form="unqualified" minOccurs="0"/>
    </xs:sequence>
  </xs:complexType>
</xs:schema>

b.xsd

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema targetNamespace="http://namespace/b" xmlns:b="http://namespace/b" xmlns:a="http://namespace/a" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:import namespace="http://namespace/a" schemaLocation="a.xsd"/>
  <xs:element name="START" type="b:B"/>
  <xs:complexType name="B">
    <xs:complexContent>
      <xs:restriction base="a:A">
        <xs:sequence>
          <xs:element name="E1">
            <xs:simpleType>
              <xs:restriction base="xs:token">
                <xs:enumeration value="value1">
                  <xs:annotation>
                    <xs:appinfo>
                      <codeName>value1</codeName>
                    </xs:appinfo>
                  </xs:annotation>
                </xs:enumeration>
                <xs:enumeration value="value2">
                  <xs:annotation>
                    <xs:appinfo>
                      <codeName>value2</codeName>
                    </xs:appinfo>
                  </xs:annotation>
                </xs:enumeration>
                <xs:enumeration value="value3">
                  <xs:annotation>
                    <xs:appinfo>
                      <codeName>value3</codeName>
                    </xs:appinfo>
                  </xs:annotation>
                </xs:enumeration>
              </xs:restriction>
            </xs:simpleType>
          </xs:element>
        </xs:sequence>
      </xs:restriction>
    </xs:complexContent>
  </xs:complexType>
</xs:schema>

example.xml

<?xml version="1.0" encoding="UTF-8"?>
<b:START xmlns="http://namespace/a" xmlns:b="http://namespace/b" xsi:schemaLocation="http://namespace/b C:problemb.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <E1>value1</E1>
</b:START>

正是示例XML中xmlns="http://namespace/a"的声明使XML偏离了……这是因为.xsd使用form="unqualified"/属性来定义E1和E2。

这个属性的效果是,它拒绝元素的名称空间,也就是说,这些元素必须没有名称空间——它们是不合格的。

要修复您的XML,您有两个选项,基于您的示例:

从根元素中删除xmlns="http://namespace/a"

<?xml version="1.0" encoding="UTF-8"?>
<b:START xmlns:b="http://namespace/b" xsi:schemaLocation="http://namespace/b b.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <E1>value1</E1>
</b:START>

或者,将xmlns="添加到E1元素:

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<!-- Sample XML generated by QTAssistant (http://www.paschidev.com) -->
<START xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:a="http://namespace/a" xmlns="http://namespace/b">
    <E1 xmlns="">value1</E1>
</START>

可能还有其他变体,但最终,以上内容对于理解如何最终在元素级别覆盖命名空间(基本上是作用域)至关重要。

最新更新