【问题标题】:How to use targetNamespace in XSD to validate XML如何在 XSD 中使用 targetNamespace 来验证 XML
【发布时间】:2015-05-31 13:21:31
【问题描述】:

我现在正式迷失在命名空间上。我正在尝试以这种(非常缩写)格式验证我们从客户那里获得的 XML:

<?xml version="1.0"?>
<order xmlns="http://dev.bla.de/schema/order/1.2">
  <order-number>400056980</order-number>
</order>

我正在尝试为此创建一个匹配的架构,我想出了:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema targetNamespace="http://dev.bla.de/schema/order/1.2" xmlns:bla="http://dev.bla.de/schema/order/1.2" xmlns:xs="http://www.w3.org/2001/XMLSchema">

<xs:element name="order" type="bla:someOrder"/>

<xs:complexType name="someOrder">
  <xs:sequence>
    <xs:element maxOccurs="1" minOccurs="1" name="order-number">
      <xs:simpleType>
        <xs:restriction base="xs:string">
          <xs:minLength value="1"></xs:minLength>
          <xs:maxLength value="13"></xs:maxLength>
        </xs:restriction>
      </xs:simpleType>
    </xs:element>
  </xs:sequence>
</xs:complexType>

</xs:schema>

但是当我使用 xmllint 验证时,我得到:

example.xsd:2: element schema: Schemas validity error : Element '{http://www.w3.org/2001/XMLSchema}schema': No matching global declaration available for the validation root.
example.xsd fails to validate

我必须如何编写这个 XSD 才能开始验证这个 XML?我在这里正式迷路了,我认为这是 targetNamespace 的问题,但是经过 2 天的努力,我不再确定任何事情......

请帮忙! ;)

解决方案:

感谢 deveth0,必须将架构的头部更改为如下所示:

<xs:schema targetNamespace="http://dev.bla.de/schema/order/1.2" xmlns="http://dev.bla.de/schema/order/1.2" xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">

  <xs:element name="order" type="someOrder" />

【问题讨论】:

    标签: xml validation xsd namespaces xml-namespaces


    【解决方案1】:

    我通过使用命名空间来验证这一点:

    <?xml version="1.0" encoding="UTF-8"?>
    <bla:order xmlns:bla="http://dev.bla.de/schema/order/1.2">
      <order-number>400056980</order-number>
    </bla:order>
    

    【讨论】:

    • 这会改变我们从客户那里获得的(固定的)XML...我需要架构来验证它而不改变 XML
    • 对不起。然后,您可以将 elementFormDefault 属性用于架构定义。 &lt;xs:schema targetNamespace="http://dev.bla.de/schema/order/1.2" xmlns="http://dev.bla.de/schema/order/1.2" xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"&gt;
    • 这只会导致Schemas parser error : Element '{http://www.w3.org/2001/XMLSchema}element', attribute 'type': The value 'bla:someOrder' of simple type 'xs:QName' has no corresponding namespace declaration in scope.
    • 是的,您可以删除架构中的 bla: 前缀,因为它们不再需要。 &lt;xs:element name="order" type="someOrder"/&gt;
    • 它工作!天哪,它有效! ;)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多