2012-04-26 25 views
3

我有一個XML模式schema.xsd與外部文件types.xsd中的自定義類型。我不知道爲什麼我的複雜類型typeComplex未正確驗證。簡單的類型,如typeSimple工作正常。那有什麼不對?XSD:導入複雜類型不起作用

Eclipse中說:

CVC-複雜type.2.4.a:無效的含量被發現開始 元素a。預計會有'{「http://www.example.org/types":a}'之一。

schema.xsd:

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    targetNamespace="http://www.example.org/schema" elementFormDefault="qualified" 
    xmlns:t="http://www.example.org/types"> 

    <xs:import schemaLocation="types.xsd" namespace="http://www.example.org/types" /> 

    <xs:element name="root"> 
     <xs:complexType> 
      <xs:all> 
       <xs:element name="simple" type="t:typeSimple" /> 
       <xs:element name="complex" type="t:typeComplex" /> 
      </xs:all> 
     </xs:complexType> 
    </xs:element> 

</xs:schema> 

types.xsd:

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    targetNamespace="http://www.example.org/types" xmlns="http://www.example.org/types" 
    elementFormDefault="qualified"> 

    <xs:simpleType name="typeSimple"> 
     <xs:restriction base="xs:string"> 
      <xs:length value="3" /> 
     </xs:restriction> 
    </xs:simpleType> 

    <xs:complexType name="typeComplex"> 
     <xs:sequence> 
      <xs:element name="a" type="xs:string" /> 
      <xs:element name="b" type="xs:string" /> 
     </xs:sequence> 
    </xs:complexType> 
</xs:schema> 

text.xml - 不得與XSD - 爲什麼?

<?xml version="1.0" encoding="UTF-8"?> 
<root xmlns="http://www.example.org/schema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://www.example.org/schema schema.xsd " xmlns:t="http://www.example.org/types"> 
    <simple>XXX</simple> 
    <complex> 
     <a></a> <!-- not valid here; Eclipse say: cvc-complex-type.2.4.a: Invalid content was found starting with element 'a'. One of '{"http://www.example.org/types":a}' is expected. --> 
     <b></b> 
    </complex> 
</root> 

回答

0

您的實例文檔被聲明爲命名空間「http://www.example.org/schema」中的「root」類型的實例。這可以。在本文檔中,您希望使用名稱空間「http://www.example.org/types」中的類型,因此您已將該名稱空間包含在前綴中。這也很好。

但是,當您使用「http://www.example.org/types」命名空間中包含的類型時,您忽略了您在xmlns聲明中定義的前綴。

引用這些類型的正確方法:

<root xmlns="http://www.example.org/schema" 
     xmlns:t="http://www.example.org/types"> 
    <simple>XXX</simple> 
    <complex> 
    <t:a></t:a> 
    <t:b></t:b> 
    </complex> 
</root> 

UPDATE

你的選擇是:

使用不合格的類型 - 只是改變你的模式定義,使elementFormDefault="unqualified"。這意味着您現在可以執行此操作:

<root xmlns="http://www.example.org/schema"> 
    <simple xmlns="">XXX</simple> 
    <complex xmlns=""> 
    <a></a> 
    <b></b> 
    </complex> 
</root> 

或者,請勿使用XSD架構。這意味着你可以使用格式良好的XML:

<root> 
    <simple>XXX</simple> 
    <complex> 
    <a></a> 
    <b></b> 
    </complex> 
</root> 
+0

它可以在不使用'噸的做什麼?我需要驗證的XML將在一個名稱空間。 – marioosh 2012-04-26 11:24:34

+0

如果您想使用來自導入的名稱空間的類型,請不要使用它。看到我的更新... – 2012-04-26 13:51:52

1

我所做的就是我想用<xs:include />

schema.xsd:

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    targetNamespace="http://www.example.org/schema" elementFormDefault="qualified"> 

    <xs:include schemaLocation="types.xsd" /> 

    <xs:element name="root"> 
     <xs:complexType> 
      <xs:all> 
       <xs:element name="simple" type="typeSimple" /> 
       <xs:element name="complex" type="typeComplex" /> 
      </xs:all> 
     </xs:complexType> 
    </xs:element> 

</xs:schema> 

types.xsd:`命名空間:

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"> 

    <xs:simpleType name="typeSimple"> 
     <xs:restriction base="xs:string"> 
      <xs:length value="3" /> 
     </xs:restriction> 
    </xs:simpleType> 

    <xs:complexType name="typeComplex"> 
     <xs:sequence> 
      <xs:element name="a" type="xs:string" /> 
      <xs:element name="b" type="xs:string" /> 
     </xs:sequence> 
    </xs:complexType> 
</xs:schema> 
+0

謝謝你的buch! ''而不是''也解決了我的問題。 – 2013-07-26 22:28:56