2017-10-17 188 views
0

我想存儲解析特定XSD文件所需的所有XSD文件。 This answer說,我們應該尋找xs:includexs:import屬性。如何查找XSD文件依賴關係

但是在元素內使用的命名空間呢?通常根元素(模式聲明)具有多個名稱空間聲明。 如果我們在XSD文件中遇到這些文件,我們是否也不應該爲這些命名空間包含XSD?

例如,在這個XSD文件中,我們不應該包含定義了urn:oma:xml:xdm:extensionsurn:ietf:params:xml:ns:resource-listshttp://www.w3.org/2001/XMLSchema名稱空間的XSD嗎?

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema 
    targetNamespace="urn:3gpp:ns:mcpttGroupInfo:1.0" 
    xmlns:mcpttgi="urn:3gpp:ns:mcpttGroupInfo:1.0" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns:oxe="urn:oma:xml:xdm:extensions" 
    xmlns:rl="urn:ietf:params:xml:ns:resource-lists" 
    elementFormDefault="qualified" attributeFormDefault="unqualified"> 

    <xs:import namespace="urn:oma:xml:xdm:extensions"/> 
    <xs:import namespace="urn:ietf:params:xml:ns:resource-lists"/> 

    <!-- XSD element and type definitions --> 

</xs:schema> 

回答

1

如果我們在XSD文件中遇到這些文件,我們是否也不應該爲這些命名空間包含XSD?

如果XSD架構文檔中我們遇到空間聲明命名空間N,下面的人會是這樣的:

  1. 這是XSD命名空間和前綴宣佈對中的元素使用架構。
  2. 它是當前模式文檔的目標名稱空間,並且聲明的前綴用於對目標名稱空間中的類型,元素,屬性等的引用。
  3. 它不是目標名稱空間,用於引用元素,類型,屬性等。
  4. 它不用於引用元素,類型,屬性等的(模式聲明),但是它是模式文檔本身中使用的某些元素或屬性的名稱空間(例如,在xsd:annotation元素中,或在XSD元素中作爲外部名稱空間屬性)。
  5. 根本沒有在架構文檔中使用它。

如果我們試圖收集一組足夠用於驗證當前模式文檔中定義的元素,屬性和類型的模式文檔(或者或多或少地等同於一組直接引用的模式文檔或間接,或明或暗地,從目前的模式文檔),則:

  1. 案例1是無關緊要的:爲XSD命名空間的架構被內置於所有符合XSD驗證,不需要收集。
  2. 案例2要求我們收集我們當前正在閱讀的模式文檔。 (大概我們已經知道了,否則我們爲什麼要先讀它呢?)
  3. 在情況3中,無論是否存在命名空間的xsd:import,在這種情況下,我們會在處理時處理它xsd:import元素,否則不存在這樣的導入,在這種情況下,當前的模式文檔是不符合的,並且當符合模式的處理器試圖從其構建模式時會引發錯誤。
  4. 在情況4中,名稱空間用於當前模式文檔(例如,包含在xsd:documentation元素中的HTML段落中);如果我們要驗證當前模式文檔中的相關元素或屬性,我們將需要該名稱空間的模式文檔。但是沒有跡象表明相關命名空間可以或將在文檔中使用,以針對該模式進行驗證。在這些文檔中可以使用的唯一有用的指示是一個xsd:import元素。
  5. 在情況5中,命名空間聲明是粗俗的,並且沒有任何明顯的目的。 (它可能是組織中使用的模式文檔模板的一部分,因爲有問題的名稱空間通常用於組織的模式文檔中 - 我的模式文檔通常爲XHTML名稱空間聲明一個前綴 - 但未在此特定模式文檔中使用無論出於何種原因)。不需要收集此名稱空間的模式文檔。

在給出的示例文檔中,有四個名稱空間聲明。一個落入殼體1:

xmlns:xs="http://www.w3.org/2001/XMLSchema" 

一個落入殼體2:

xmlns:mcpttgi="urn:3gpp:ns:mcpttGroupInfo:1.0" 

兩個落入殼體3(或可能情況下5),以及用於這些也有XSD:導入說明:

xmlns:oxe="urn:oma:xml:xdm:extensions" 
xmlns:rl="urn:ietf:params:xml:ns:resource-lists" 

如果我們提高了我們收集的命名空間聲明,而不是XSD政策:進口和xsd:include指令,這裏的區別是,我們(一)增加對XSD架構文檔架構以我們的集合, (b)可能搜索當前模式文檔的目標名稱空間的其他可用模式文檔。 (在某些情況下,這可能是可取的;在其他情況下,我們對同一命名空間有不同的模式,並且收集所有這些模式將會適得其反,因爲它會產生冗餘且可能自相矛盾的一組聲明。)

+0

感謝這個全面的答案,不幸的是,由於我對XML的知識有限,我很難理解它,所以我創建了[在GitHub上的一個小項目](https://github.com/neno--/fun-with -xml)來練習你提到的各種選項。現在我可以從您的答案中獲得更多益處。 [Beginning XML 5th Edition]中的章節(https://www.amazon.com/Beginning-XML-Joe-Fawcett/dp/1118162137/ref=sr_1_1?ie=UTF8&qid=1509431951&sr=8-1&keywords=beginning+xml )被證明非常有用。 我發佈了自己的答案來詳細闡述一些。 – igobivo

2
http://www.w3.org/2001/XMLSchema 

是定義這是自動理解架構元素和按照慣例特殊命名空間(儘管它不是必需的)使用「XS」別名。

你行

xmlns:xs="http://www.w3.org/2001/XMLSchema" 

簡單地定義架構元素的默認命名空間的別名。

要包含urn:oma:xml:xdm:extensionsurn:ietf:params:xml:ns:resource-lists的模式,您需要提供schemaLocation屬性,例如,

<xs:import namespace="urn:oma:xml:xdm:extensions" 
      schemaLocation="http://yourSchemaLocation/yourSchema.xsd"/> 

N.B. schemaLocation可以是相對的,這對我自己的模式來說可能更合適,當然也更方便。所以也許

<xs:import namespace="urn:oma:xml:xdm:extensions" 
      schemaLocation="./yourSupportingSchemaLocation/yourSchema.xsd"/> 

會是一個更好的例子。

+0

在導入和包含的情況下,我們必須明確提供模式位置是一種痛苦。使相對'schemaLocation'使事情變得更加便攜。我想知道爲什麼這是強制性的,而不是模式聲明的位置屬性。另外,[我在這裏閱讀](https://www.ibm.com/developerworks/library/x-javaxmlvalidapi/index.html),架構的顯式位置被認爲是不好的做法。文章說,「通常文檔消費者應該選擇模式,而不是文檔製作者。」 – igobivo

0

全部總而言之,在定義XML模式時,include標籤必須具有位置屬性。否則模式將無效。 儘管導入和包含語句使用的XSD文件可能會丟失,並且這可能會導致驗證程序繼續進行寬鬆驗證,但應將其視爲依賴關係 ,因爲有意在XSD模式中使用它們。

由於XSD模式也是實例文檔,所以它們也對模​​式文檔有依賴關係。但是對於這種特殊情況,它們位於「http://www.w3.org/2001/XMLSchema」(XML模式名稱空間)名稱空間中,該名稱空間被硬編碼到XML Validator中。所以沒有必要提供它。

對於「自定義模式」創建的「其他」實例文檔(這不是我的問題的一部分,只是提及完整性),儘管可以明確定義模式位置,但模式位置並不是強制性的。如果未定義,則可以指示XML驗證程序以編程方式使用某個模式 - 最後選擇哪個文件取決於實現。

但是,它肯定必須找到一些模式來驗證實例文檔 - 如果有一個名稱空間聲明開始。 如果此模式有一些包含和導入,則這些文件也必須可用,並且它們必須位於location屬性中指定的位置。

+0

您說「定義XML模式時,...導入標記必須具有位置屬性」 - 不是這樣。 xsd:import元素可能具有schemaLocation屬性,但不是必需的。處理器可能有其他方法來爲導入的名稱空間查找模式。 –

+0

對,我編輯了這個。我嘗試'import'沒有'schemaLocation'和我使用的驗證器引發了一個錯誤。但從技術上講,XSD是有效的。 – igobivo