【问题标题】:why does xmllint give schemas parser error?为什么 xmllint 会给出模式解析器错误?
【发布时间】:2019-06-07 00:41:21
【问题描述】:

shiporder.xml 来自 w3schools;架构验证失败:

thufir@dur:~/xml/ship$ 
thufir@dur:~/xml/ship$ ls
shiporder.xml
thufir@dur:~/xml/ship$ 
thufir@dur:~/xml/ship$ trang shiporder.xml shiporder.xsd
thufir@dur:~/xml/ship$ 
thufir@dur:~/xml/ship$ ls
shiporder.xml  shiporder.xsd  xsi.xsd
thufir@dur:~/xml/ship$ 
thufir@dur:~/xml/ship$ cat xsi.xsd 
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" targetNamespace="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <xs:import schemaLocation="shiporder.xsd"/>
  <xs:attribute name="noNamespaceSchemaLocation" type="xs:NCName"/>
</xs:schema>
thufir@dur:~/xml/ship$ 
thufir@dur:~/xml/ship$ cat shiporder.xsd 
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <xs:import namespace="http://www.w3.org/2001/XMLSchema-instance" schemaLocation="xsi.xsd"/>
  <xs:element name="shiporder">
    <xs:complexType>
      <xs:sequence>
        <xs:element ref="orderperson"/>
        <xs:element ref="shipto"/>
        <xs:element maxOccurs="unbounded" ref="item"/>
      </xs:sequence>
      <xs:attribute name="orderid" use="required" type="xs:integer"/>
      <xs:attribute ref="xsi:noNamespaceSchemaLocation" use="required"/>
    </xs:complexType>
  </xs:element>
  <xs:element name="orderperson" type="xs:string"/>
  <xs:element name="shipto">
    <xs:complexType>
      <xs:sequence>
        <xs:element ref="name"/>
        <xs:element ref="address"/>
        <xs:element ref="city"/>
        <xs:element ref="country"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
  <xs:element name="name" type="xs:string"/>
  <xs:element name="address" type="xs:string"/>
  <xs:element name="city" type="xs:string"/>
  <xs:element name="country" type="xs:NCName"/>
  <xs:element name="item">
    <xs:complexType>
      <xs:sequence>
        <xs:element ref="title"/>
        <xs:element minOccurs="0" ref="note"/>
        <xs:element ref="quantity"/>
        <xs:element ref="price"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
  <xs:element name="title" type="xs:string"/>
  <xs:element name="note" type="xs:string"/>
  <xs:element name="quantity" type="xs:integer"/>
  <xs:element name="price" type="xs:decimal"/>
</xs:schema>
thufir@dur:~/xml/ship$ 
thufir@dur:~/xml/ship$ xmllint --noout --schema shiporder.xsd shiporder.xml
xsi.xsd:4: element attribute: Schemas parser error : Element '{http://www.w3.org/2001/XMLSchema}attribute': The target namespace must not match 'http://www.w3.org/2001/XMLSchema-instance'.
WXS schema shiporder.xsd failed to compile
thufir@dur:~/xml/ship$ 
thufir@dur:~/xml/ship$ cat shiporder.xml 
<?xml version="1.0" encoding="UTF-8"?>

<shiporder orderid="889923"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="shiporder.xsd">
  <orderperson>John Smith</orderperson>
  <shipto>
    <name>Ola Nordmann</name>
    <address>Langgt 23</address>
    <city>4000 Stavanger</city>
    <country>Norway</country>
  </shipto>
  <item>
    <title>Empire Burlesque</title>
    <note>Special Edition</note>
    <quantity>1</quantity>
    <price>10.90</price>
  </item>
  <item>
    <title>Hide your heart</title>
    <quantity>1</quantity>
    <price>9.90</price>
  </item>
</shiporder> 


thufir@dur:~/xml/ship$ 

不应该xmllint 能够验证document 是否有效,就像xsd 是如何通过trang 生成的一样?

【问题讨论】:

  • 您的 shiporder.xsd 文件的内容是什么?因为错误显示的是 XML 有效负载示例,并且错误表明 XSD 没有命名空间 w3.org/2001/XMLSchema-instance
  • 这就是解决方案,@Dijkgraaf 谢谢 :)

标签: xml xslt xsd xml-parsing xmllint


【解决方案1】:

我删除了引用“http://www.w3.org/2001/XMLSchema-instance”的第 2 行和第 12 行,以便现在验证:

thufir@dur:~/xml/ship$ 
thufir@dur:~/xml/ship$ xmllint --noout --schema shiporder.xsd shiporder.xml
shiporder.xml validates
thufir@dur:~/xml/ship$ 
thufir@dur:~/xml/ship$ ls
shiporder.xml  shiporder.xsd  xsi.xsd
thufir@dur:~/xml/ship$ 
thufir@dur:~/xml/ship$ cat xsi.xsd 
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" targetNamespace="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <xs:import schemaLocation="shiporder.xsd"/>
  <xs:attribute name="noNamespaceSchemaLocation" type="xs:NCName"/>
</xs:schema>
thufir@dur:~/xml/ship$ 
thufir@dur:~/xml/ship$ cat shiporder.xsd 
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <xs:element name="shiporder">
    <xs:complexType>
      <xs:sequence>
        <xs:element ref="orderperson"/>
        <xs:element ref="shipto"/>
        <xs:element maxOccurs="unbounded" ref="item"/>
      </xs:sequence>
      <xs:attribute name="orderid" use="required" type="xs:integer"/>
    </xs:complexType>
  </xs:element>
  <xs:element name="orderperson" type="xs:string"/>
  <xs:element name="shipto">
    <xs:complexType>
      <xs:sequence>
        <xs:element ref="name"/>
        <xs:element ref="address"/>
        <xs:element ref="city"/>
        <xs:element ref="country"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
  <xs:element name="name" type="xs:string"/>
  <xs:element name="address" type="xs:string"/>
  <xs:element name="city" type="xs:string"/>
  <xs:element name="country" type="xs:NCName"/>
  <xs:element name="item">
    <xs:complexType>
      <xs:sequence>
        <xs:element ref="title"/>
        <xs:element minOccurs="0" ref="note"/>
        <xs:element ref="quantity"/>
        <xs:element ref="price"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
  <xs:element name="title" type="xs:string"/>
  <xs:element name="note" type="xs:string"/>
  <xs:element name="quantity" type="xs:integer"/>
  <xs:element name="price" type="xs:decimal"/>
</xs:schema>
thufir@dur:~/xml/ship$ 

但是为什么呢?而且,我能不能生成xsd 以便没有这样的引用,或者引用正确引用?

【讨论】:

    猜你喜欢
    • 2016-06-04
    • 1970-01-01
    • 2012-12-01
    • 2021-09-03
    • 1970-01-01
    • 2018-07-17
    • 1970-01-01
    • 1970-01-01
    • 2020-12-24
    相关资源
    最近更新 更多