2015-08-15 37 views
3

我的問題是關於2個XSD模式,它們必須是XML文檔的基礎。對我來說,首先創建我需要的XML然後創建這些XSD架構會更容易。所以,我在這裏有三個文件。如何將2個xsd模式包含到1個xml文件中?

1 XSD:

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

    <xs:element name="studentAI"> 
     <xs:complexType> 
      <xs:sequence> 
       <xs:element name="gender"> 
        <xs:simpleType> 
         <xs:restriction base="xs:string"> 
          <xs:enumeration value="female"/> 
          <xs:enumeration value="male"/> 
         </xs:restriction> 
        </xs:simpleType> 
       </xs:element> 
       <xs:element name="age"> 
        <xs:simpleType> 
         <xs:restriction base="xs:integer"> 
          <xs:minInclusive value="0"/> 
          <xs:maxInclusive value="100"/> 
         </xs:restriction> 
        </xs:simpleType> 
       </xs:element> 
       <xs:element name="other" type="desc"/> 
      </xs:sequence> 
     </xs:complexType> 
    </xs:element> 

    <xs:complexType name="desc"> 
     <xs:sequence> 
      <xs:element name="height" type="xs:string"/> 
      <xs:element name="weight" type="xs:string"/> 
     </xs:sequence> 
    </xs:complexType> 

</xs:schema> 

第二XSD:

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

    <xs:element name="group"> 
     <xs:complexType> 
      <xs:sequence> 
       <xs:element name="student" minOccurs="2" maxOccurs="unbounded"/> 
      </xs:sequence> 
     </xs:complexType> 
    </xs:element> 

    <xs:complexType name="student"> 
     <xs:sequence> 
      <xs:element name="surname" type="xs:string"/> 
      <xs:element name="name" type="xs:string"/> 
      <xs:element name="birthday"> 
       <xs:simpleType> 
        <xs:restriction base="xs:date"/> 
       </xs:simpleType> 
      </xs:element> 
      <xs:element name="parents" type="parentsDetails"/> 
      <xs:element name="allCourses" type="allCoursesDetails"/> 
     </xs:sequence> 
     <xs:attribute name="id" type="xs:string" use="required"/> 
    </xs:complexType> 

    <xs:complexType name="parentsDetails"> 
     <xs:sequence> 
      <xs:element name="father" type="xs:string"/> 
      <xs:element name="mother" type="xs:string"/> 
     </xs:sequence> 
    </xs:complexType> 

    <xs:complexType name="allCoursesDetails"> 
     <xs:sequence> 
      <xs:element name="course" type="courseDetails" minOccurs="0" maxOccurs="unbounded"/> 
     </xs:sequence> 
    </xs:complexType> 

    <xs:complexType name="courseDetails"> 
     <xs:attribute name="nr" use="required"/> 
    </xs:complexType> 

</xs:schema> 

,我需要得到那些2種XSD模式的基礎(對不起,它是空的,但現在當然也有XML文檔必須是信息,它將在該組中不止一個學生):

<group xmlns:xs="http://www.w3schools.com" 
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
        xsi:schemaLocation="http://www.w3schools.com "> 

    <student id="1"> 
     <surname></surname> 
     <name></name> 
     <birthday></birthday> 
     <parents> 
      <father></father> 
      <mother></mother> 
     </parents> 
     <allCourses> 
      <course nr="01"></course> 
      <course nr="02"></course> 
     </allCourses> 
     <studentAI> 
      <gender></gender> 
      <age></age> 
      <other> 
       <height></height> 
       <weight></weight> 
      </other> 
     </studentAI> 
    </student> 
</group> 

我真的不知道如何包括那些2 X SD模式在我的XML文檔中。我是否應該將它們都包含在XML文檔中,或者我應該首先將第一個XSD模式包含到第二個模塊中(就像結果XML一樣),然後將統一XML模式包含到XML文檔中?以及如何做到這一點?

我最大的問題是關於三個文件的上半部分,其中一個應該放置命名空間的聲明等等。

至於我試圖使用它的程序是氧氣(我有30天lisense)。

我真的希望有人能幫助我。我也希望我的問題很明確。

很多人提前感謝您的幫助!

+0

XML對第二個XSD無效,因爲''不允許有''元素(或者我錯了)?在使用多個XSD時,這些XSD可能有自己的名稱空間,並且可以將名稱空間綁定到XSD。所以你有XSD 1的命名空間A和XSD 2的命名空間B. –

+0

我會創建一個人物,在第一個XSD中給它一個特性,並讓其他特性擴展它 - 學生是一種人,父母是也是人。 –

+0

@Wouter J,謝謝你的關注和評論。是的,'學生'不允許''studentAl'裏面,但我需要結合我的XSD以某種方式,並在他們的基礎上創建我的XML。至於命名空間,我認爲兩個XSD都可以有相同的名稱空間。所以我需要將它們包含到我的XML中 - 這個我不知道該怎麼做... –

回答

2

您可以將兩個模式的內容合併到獨特模式中,使模式包含另一個模式。如果您使用nameref在命名空間中引用一個元素需要判定的是引用(或者簡單地使用你的目標名稱爲您的XSD默認的命名空間更易於)

  1. :反正你應該糾正這個問題。因此,將您的目標名稱空間綁定到前綴

    xmlns:w3="http://www.w3schools.com" 
    

    然後糾正你引用,例如:

    <xs:element name="allCourses" type="w3:allCoursesDetails"/> 
    

    或者乾脆在你的XSD設定的目標名稱爲默認名稱空間

    xmlns="http://www.w3schools.com" 
    

    這樣不合格的引用指向默認名稱空間,即設置爲目標名稱空間。

  2. 然後,如果你希望你的XML是有效的與所有屬於targetNampesce的元素,你應該使用你的/你的xs:schemaelementFormDefault="qualified"。否則,一些XML元素應屬於目標名稱空間,其中一些不應屬於任何名稱空間。

  3. 的第一個模式的內容添加到包含學生元素或架構添加包括條款,使學生架構包括studentAI

    <xs:include schemaLocation="studentAI.xsd"/> 
    
  4. 後你只需要對包含學生元素的模式驗證XML,所以你需要添加xsi:schemaLoc通貨膨脹在你的XML:您可以參考要素使用ref

    xsi:schemaLocation="http://www.w3schools.com xsd1.xsd" 
    
  5. 記住。您需要添加studentAIallCourses元素的順序:

    <xs:element name="allCourses" type="allCoursesDetails"/> 
    <xs:element ref="studentAI"/> 
    
  6. 另外請記住,你可以簡化生日元素,你並不需要限制元素,如果你不加入任何限制。

希望這可以幫助你。

編輯:增加了一些東西(項目5和6)。

+0

非常感謝您的幫助!我根據你的答案做了所有的事情,它的工作原理!但不是全部,因爲我仍然不能將XSD1包含到XSD2中。我在我的XSD2中編寫了'',但仍然驗證器顯示'讀取模式文檔失敗'。我也嘗試通過這個''添加一個引用,但它也不起作用。也許你可以建議我做錯了什麼?所有其他工作正常,再次感謝你。 –

+0

不客氣。可能你忘記了命名空間(如果有的話)或文件名或路徑不正確。當你使用oxygenXML時,你可以打開你的xml文件,然後選擇菜單Document> Schema> Associate Schema,然後在下拉列表中選擇你的xsd,如果它打開的話 – sergioFC

+0

對不起,這是爲了將你的xsd關聯到你的xml。由於架構未正確包含,因此Ref失敗。路徑不正確(也許它位於不同的文件夾中?)或者xsd無效。 – sergioFC

1

首先,您的術語是adrift。模式是一組模式組件。如果您有兩個模式,這意味着您確實有一個模式,它們是來自兩者的模式組件的聯合。您所談論的內容不是模式,而是模式文檔,它們是包含模式組件的XML表示的文件。

您的兩個模式文檔共享相同的目標名稱空間。您使用的名稱空間http://www.w3schools.com是一個糟糕的選擇,因爲它是您不擁有的域名。但這是一個禮儀而不是技術問題的問題。

但是,奇怪的是看到xsi:schemaLocation="http://www.w3schools.com "。如果必須使用xsi:schemaLocation從實例文檔引用模式,那麼該屬性應包含偶數個URI:它實質上是從名稱空間URI到具有該目標名稱空間的模式文檔的URL位置的映射。

如果特定的命名空間的架構在多個模式文檔拆分,然後XSI:的schemaLocation不能引用他們。最好有一個模式文檔完整地描述名稱空間,或者在單個文檔中,或者使用xs:include聲明將所有構成模式文檔組合在一起。

就我個人而言,我發現從一個實例引用模式文檔的想法並不令人滿意。如果你不信任它,你只需要驗證一個實例文檔。但是,如果你不信任它,那麼你想根據你選擇的模式進行驗證,而不是實例文檔自己選擇的模式。說「我想檢查這個文檔是否有效,但我不在乎它是否有效,我會讓文檔自己決定這個文檔」。

相關問題