2009-09-19 135 views
3

所以我從XML和Schemas開始,今天碰到了這個,我一直沒有弄明白。找不到元素'assignments'的聲明

我正在和錯誤,說,

LN 5西2:找不到 聲明元素 '任務' 的。

我相信我已經聲明瞭元素,但也許我錯過了一些東西,沒有。

這是我的XML文件:

<?xml version="1.0" encoding="UTF-8"?> 
<assignments 
    xmlns="http://www.w3.org/2001/XMLSchema-instance" 
    SchemaLocation="A3.xsd" 
> 
    <assignment id="a1"> 
     <name>Schemas</name> 
     <page>110</page> 
    </assignment> 

    <assignment id="a2"> 
     <name>Namespaces</name> 
     <page>258</page> 
     <files>names.xml</files> 
     <files>names.dtd</files> 
    </assignment> 

    <assignment id="a3"> 
     <name>RELAX NG</name> 
     <page>305</page> 
     <files>account.xml</files> 
     <files>customers.xml</files> 
     <files>finance.xsd</files> 
    </assignment> 

</assignments> 

這是我的模式文件:

<?xml version="1.0" encoding="UTF-8"?> 
<schema 
    xmlns="http://www.w3.org/2001/XMLSchema" 
    xmlns:target="http://www.levijackson.net/web340/ns" 
    targetNamespace="http://www.levijackson.net/web340/ns" elementFormDefault="qualified" 
> 
<element name="assignments" type="target:TypeAssignments"></element> 

<complexType name="TypeAssignments"> 
    <sequence> 
     <element name="assignment" type="target:assignmentInfo"></element> 
    </sequence> 
    <attribute name="id" type="string" use="required"/> 
</complexType> 

<complexType name="assignmentInfo"> 
    <sequence> 
      <element name="name" type="string"></element> 
      <element name="page" type="target:TypePage"></element> 
      <element name="file" type="target:TypeFile" minOccurs="0" maxOccurs="unbounded"></element> 
    </sequence> 
</complexType> 

<simpleType name="TypePage"> 
    <restriction base="integer"> 
     <minInclusive value="50" /> 
     <maxInclusive value="498" /> 
    </restriction> 
</simpleType> 

<simpleType name="TypeFile"> 
    <restriction base="string"> 
     <enumeration value=".xml" /> 
     <enumeration value=".dtd" /> 
     <enumeration value=".xsd" /> 
    </restriction> 
</simpleType> 

</schema> 

由於我還在學習,隨時指出我可能作出不相關的任何其他錯誤解決問題。

感謝
列維

+1

你不應該分配http://www.w3.org/2001/XMLSchema-instance作爲默認的命名空間,因爲那被認爲是在你的XML,其名稱空間的所有元素的名稱空間尚未明確規定。將http://www.w3.org/2001/XMLSchema-instance分配給不同的命名空間,如常用的xmlns:xsi。 – Joren 2009-09-20 00:05:39

+0

如果我這樣設置它,我需要指定一個像這樣的元素類型:type =「xsi:string」? – Levi 2009-09-20 00:09:00

+1

是的。 順便說一下,在XSD架構中,通常使用xs,而在XML文件中使用xsi。 – Joren 2009-09-20 00:19:28

回答

2

對這一問題的解決方案是,我並沒有宣佈我的主要元素「分配」作爲複雜元素,其實我WASN」不要宣稱它是任何東西。

因此,通過採取這條線從我的模式文件:

<element name="assignment" type="target:assignmentInfo" minOccurs="0" maxOccurs="unbounded"></element> 

,並改變這個:

<element name="assignments"> 
    <complexType> 
     <sequence> 
      <element name="assignment" type="target:assignmentInfo" minOccurs="0" maxOccurs="unbounded"></element> 
     </sequence> 
    </complexType> 
</element> 

元素被正確定義的,感謝大家的幫助。

列維

0

嘗試以下。我拿出一些架構元素的額外的細節,但有一點扭捏類似於下面的東西應該工作:

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">   
    <xs:element name="assignments" type="TypeAssignments" />  
    <xs:complexType name="TypeAssignments"> 
    <xs:sequence> 
     <xs:element name="assignment" type="assignmentInfo" 
      minOccurs="0" maxOccurs="unbounded" /> 
    </xs:sequence>   
    </xs:complexType> 

    <xs:complexType name="assignmentInfo"> 
    <xs:sequence> 
     <xs:element name="name" type="xs:string" /> 
     <xs:element name="page" type="TypePage" /> 
     <xs:element name="files" type="xs:string" minOccurs="0" maxOccurs="unbounded"/> 
    </xs:sequence> 
    <xs:attribute name="id" type="xs:string" use="required" /> 
    </xs:complexType> 

    <xs:simpleType name="TypePage"> 
    <xs:restriction base="xs:integer"> 
     <xs:minInclusive value="50" /> 
     <xs:maxInclusive value="498" /> 
    </xs:restriction> 
    </xs:simpleType> 

    <xs:simpleType name="TypeFile"> 
    <xs:restriction base="xs:string"> 
     <xs:enumeration value=".xml" /> 
     <xs:enumeration value=".dtd" /> 
     <xs:enumeration value=".xsd" /> 
    </xs:restriction> 
    </xs:simpleType> 
</xs:schema> 

注意

  1. ID屬性已經從TypeAssignments移動到assignmentInfo
  2. 所有類型和元素名稱前綴名稱空間xs
  3. 我已爲分配元素添加了minOccurs和maxOccurs屬性。否則,分配內只允許有一個賦值元素。
  4. 我已經使用「/>」而不是「」自動關閉了您的元素「」不是必需的,但少打字。

總而言之,我沒有修改那麼多,所以你有正確的想法。

+0

我明白爲什麼使用xs:前綴作爲名稱空間。對於我來說,將xml文件中使用的名稱空間聲明爲更容易,所以我不必使用xs:?前綴模式中的所有元素。所以如果我說一些像 Levi 2009-09-20 01:27:51

+2

不幸的是,你需要在xs前加上元素,因爲類型(例如字符串,元素,枚舉等)被定義爲單獨模式的一部分。 – 2009-09-20 01:31:27

+0

如果在我聲明的模式的頂部而不是只是說,那麼它會成爲頁面的默認模式嗎?對於我的其他元素,我會在開頭標記中指定另一個模式,如下所示: xmlns:target =「http://www.levijackson.net/web340/ns」 targetNamespace =「http://www.levijackson.net/web340/ns「elementFormDefault =」qualified「 然後對我創建的屬性值使用target:assignmentInfo等等。 – Levi 2009-09-20 01:44:29

0

在您的實例文檔中,如上面摘錄的那樣,您在<assignments>元素上定義了xmlns屬性,並且不在別處定義名稱空間。這意味着<assignments>及其所有後代的命名空間設置爲「http://www.w3.org/2001/XMLSchema-instance」。

但是,您的模式文檔指定的值爲「http://www.levijackson.net/web340/ns」的targetNamespace。由於實例文檔中的元素沒有這個名稱空間,所以驗證失敗。

開始改變你的實例文檔看起來像這樣:

<assignments 
    xmlns="http://www.levijackson.net/web340/ns" 
+0

我不知道你在告訴我該怎麼做,你粘貼的是我上面的內容。另外,targetNamespace引用我聲明的第二個名稱空間。除非我誤認爲目標名稱空間的工作原理。 – Levi 2009-09-22 23:03:24