代码之家  ›  专栏  ›  技术社区  ›  Justin Zayne

如何在XSD中使用targetNamespace验证XML

  •  3
  • Justin Zayne  · 技术社区  · 10 年前

    我现在正式迷上了名称空间。我试图验证我们从客户那里得到的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的问题,但经过两天的努力,我对任何事情都不确定了。。。

    请帮助!;)

    解决方案:

    为了开发模式的头部,必须将其更改为如下所示:

    <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" />
    
    1 回复  |  直到 10 年前
        1
  •  1
  •   deveth0    10 年前

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

    <?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>