2016-08-23 42 views
1

我試圖從XSD擴展複雜類型面臨的一個問題擴展XML複雜類型。關鍵是這 - 複合型我想實現是一個命名空間,這同一個命名空間設置爲父母的targetNamespace無法與父類型命名空間中的

這裏是父XSD(相關部分)

<?xml version="1.0" encoding="utf-8"?> 
<xs:schema xmlns:tns="http://schemas.mandiant.com/2010/ioc" 
      elementFormDefault="qualified" 
      targetNamespace="http://schemas.mandiant.com/2010/ioc" 
      xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:element name="ioc" nillable="true" 
       type="tns:IndicatorOfCompromise" /> 
    <xs:complexType name="IndicatorOfCompromise"> 
    <xs:sequence> 
     <xs:element minOccurs="0" maxOccurs="1" 
        name="short_description" type="xs:string" /> 
     <xs:element minOccurs="0" maxOccurs="1" 
        name="description" type="xs:string" /> 
     <xs:element minOccurs="0" maxOccurs="1" 
        name="keywords" type="xs:string" /> 
     <xs:element minOccurs="0" maxOccurs="1" 
        name="authored_by" type="xs:string" /> 
     <xs:element minOccurs="1" maxOccurs="1" 
        name="authored_date" nillable="true" 
        type="xs:dateTime" /> 
     <xs:element minOccurs="0" maxOccurs="1" 
        name="links" type="tns:ArrayOfLink" /> 
     <xs:element minOccurs="0" maxOccurs="1" 
        name="definition" type="tns:ArrayOfIocIndicator" /> 
    </xs:sequence> 
    <xs:attribute name="id" type="xs:string" /> 
    <xs:attribute name="last-modified" type="xs:dateTime" 
        use="required" /> 
    </xs:complexType> 
</xs:schema> 

這是我正在努力擴大(主要添加一些更多的元素),它

<?xml version="1.0" encoding="utf-8" ?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
      targetNamespace="http://schemas.mandiant.com/2010/ioc" > 
    <xs:import namespace="urn:tns" 
       schemaLocation="openioc_schema_v10.xsd" /> 
    <xs:redefine schemaLocation="openioc_schema_v10.xsd"> 
     <xs:complexType name="IndicatorOfCompromise"> 
     <xs:complexContent> 
      <xs:extension base="tns:IndicatorOfCompromise"> 
      <xs:sequence> 
       <xs:element name="category" type="xs:string" /> 
       <xs:element name="family" type="xs:string" /> 
      </xs:sequence> 
      </xs:extension> 
     </xs:complexContent> 
     </xs:complexType> 
    </xs:redefine> 
</xs:schema> 

當我試圖驗證下面的XML根據該模式,

<?xml version='1.0' encoding='UTF-8'?> 
<ioc xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
    xmlns="http://schemas.mandiant.com/2010/ioc" 
    id="2555192b-186b-441d-bbdd-1d2fb41f462f" 
    last-modified="2016-05-12T12:14:50" 
    xmlns:qioc_v10="ioc_qualys_v10.xsd" 
    xsi:schemaLocation="ioc_qualys_v10.xsd"> 
    <short_description>Bagsu!rfn</short_description> 
    <description>This is a placeholder for description of the Bagsu!rfn malware family.</description> 
    <keywords/> 
    <authored_by>IOC_api</authored_by> 
    <authored_date>2016-05-12T12:14:50</authored_date> 
    <qioc_v10:category>XYZ</qioc_v10:category> 
    <qioc_v10:family>XYZ 2</qioc_v10:family> 
    <links/> 
</ioc> 

它提供了一個錯誤「的命名空間屬性,:一個電子的「甕TNS的, lement信息項必須與導入文檔的targetNamespace屬性'http://schemas.mandiant.com/2010/ioc'相同。「

如何去呢?我已經通過了幾個Stackoverflow的帖子,但似乎沒有解決我的難題。我已經理解了我需要擴展的元素駐留在命名空間中,但沒有得到解決的辦法。

請注意,我不能觸到父XSD以任何方式。這是OpenIOC標準。

回答

3

你可能想在XSD導入的基礎知識閱讀起來,包括重新定義,以及(對於XSD 1.1)覆蓋。這將減少你必須做的猜測量。

在這種情況下,當地的修改有幾個問題,都與你有猜測做具有什麼-架構文檔間的引用意味着一個清楚的認識,而不是。

  1. 首先,導入語句與您建議導入的模式文檔不兼容。告訴你當地的模式有:

    <xs:import namespace="urn:tns" 
         schemaLocation="openioc_schema_v10.xsd" /> 
    

    這意味着「在這裏聲明的部件可參考架構組件的命名空間甕:TNS;該命名空間的架構文檔可以在openioc_schema_v10.xsd找到」但是,如果架構處理器接受你的提示,並嘗試讀取openioc_schema_v10.xsd,它發現它的目標命名空間是http://schemas.mandiant.com/2010/ioc,不是甕:TNS。它不可能爲名稱空間urn:tns聲明任何組件,所以它不能在名稱空間urn:tns的導入的schemaLocation屬性中有效地命名。

  2. 可以解決這個問題,當然,通過指定的import語句正確的命名空間:

    <xs:import namespace="http://schemas.mandiant.com/2010/ioc" 
         schemaLocation="openioc_schema_v10.xsd" /> 
    

    如果你這樣做,你會得到一個新的和不同的錯誤信息,因爲你正在努力爲目標命名空間導入模式。正如普通英語中的「進口」一樣,意味着將國外商品引入國內市場,因此XSD中的「導入」意味着從其他(外國)名稱空間引入模式組件。您無法爲目標命名空間導入模式。這就是xsd:include的用途。

  3. 如果您將導入更改爲包含,您可能會或可能不會得到引發錯誤消息的架構,但是您將不會獲得跨實現可靠工作的架構,因爲現在您都包括(不變)版本的openioc_schema_v10.xsd(通過包含)幷包括它的修改版本(通過重新定義)。

    你最好是完全消除進口應該是包括的。在openioc_schema_v10.xsd中定義的模式的重定義將引入該模式的所有模式組件,並通過重定義指定修改。

  4. 如果刪除了錯誤和不必要的進口,你會發現,你的類型IndicatorOfCompromise的聲明指定TNS的基本類型:IndicatorOfCompromise,但now​​where您的架構文檔中你綁定的命名空間前綴TNS任何命名空間。您在XS想

    xmlns:tns="http://schemas.mandiant.com/2010/ioc" 
    

:擴展元素或祖先。

這些是第一眼看得見的機械問題;可能還有更多。正如我所說:找到一個好的教程,閱讀它,學習包含,導入,重新定義和覆蓋的基礎知識。另一件事:如果你要擴展一個公開定義的類型,你可能應該在你自己的名字空間中定義新類型,而不是通過重新定義屬於其他人。但是這會讓我們走得太遠。祝你好運。

相關問題