【问题标题】:XSD XML - validation error while using restrictionXSD XML - 使用限制时出现验证错误
【发布时间】:2013-12-10 00:51:18
【问题描述】:

我有两个有效的 XSD 文件(a.xsd 和 b.xsd)。我尝试根据 Schema 验证 XML 文件 (example.xml) 并收到错误。

谁能向我解释一下,为什么我会收到验证错误?

谢谢


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:\problem\b.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <E1>value1</E1>
</b:START>

【问题讨论】:

  • 我还想通过 JAXB (unmarshal & marshal) 使用这个 XSD 生成 Java 类。如果从Petru那里取空命名空间的解决方案,则E1的内容不会映射到Java类中,因为a.xsd的定义是,E1属于命名空间namespace/a ...

标签: xml xsd


【解决方案1】:

这是您的示例 XML 中的 xmlns="http://namespace/a" 声明使您的 XML 关闭...这是因为您的 a.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>

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

【讨论】:

  • +1。 @user3083431:如果对您有帮助,请记住 accept Petru's answer。谢谢。
  • 好的,明白了......下一个问题:应该在 XSD 中进行哪些更改以将它们用于 JAXB(编组/解组)?因为在生成的类中,E1 元素位于命名空间 ''namespace/a'' 中,所以会导致验证错误。
  • @user3083431,您应该创建一个新问题并将其标记为“jaxb”(除了您可能想要的任何其他标签)。不要忘记添加有关您的 JAXB 设置的详细信息,例如版本信息、生成代码的相关 sn-ps 等。
猜你喜欢
  • 2014-05-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-29
  • 2021-08-24
  • 1970-01-01
相关资源
最近更新 更多