2013-10-24 11 views
0

命名空間,因此驗證XML文件,而無需在XML命名空間聲明我如何修改這個XSD架構工作?當有候選XML包含相同的命名空間的聲明,但顯然的工作流程是,如果我沒有先編輯候選文檔更容易寫XSD無需在目標XML

架構並進行驗證。

我敢肯定,我失去了簡單的東西在這裏,但一個小時的猜測沒有接通的把戲。

架構 - data.xsd

<schema 
    xmlns=xsd:"http://www.w3.org/2001/XMLSchema" 
    xmlns:target="http://myurl.com/response" 
    targetNamespace="http://myurl.com/response" 
    elementFormDefault="qualified"> 
    <xsd:element name="response"> 
    <xsd:complexType mixed="true" name="response"> 
     <xsd:all> 
     <xsd:element name="item"> 
      <xsd:complexType> 
      <xsd:sequence> 
       <xsd:any namespace="##any" 
        processContents="lax" 
        minOccurs="0" 
        maxOccurs="unbounded" /xsd:> 
      </xsd:sequence> 
      </xsd:complexType> 
     </xsd:element> 
     <xsd:element name="activities" > 
      <xsd:complexType> 
      <xsd:sequence> 
       <xsd:any namespace="##any" 
        processContents="lax" 
        minOccurs="0" 
        maxOccurs="unbounded" /xsd:> 
      </xsd:sequence> 
      </xsd:complexType> 
     </xsd:element> 
     <!-- et cetera --> 
     </xsd:all> 
    </xsd:complexType> 
    </xsd:element> 
</xsd:schema> 

本文檔驗證 - data.namespaced.xml

<?xml version="1.0" encoding="utf-8"?> 
<response 
    xmlns="http://myurl.com/response" 
    > 
    <item> 
    <! -- valid stuff --> 
    </item> 
    <activities> 
    <! -- valid stuff --> 
    </activities> 
</response> 

本文件並不 - data.xml中

<?xml version="1.0" encoding="utf-8"?> 
<response> 
    <item> 
    <! -- valid stuff --> 
    </item> 
    <activities> 
    <! -- valid stuff --> 
    </activities> 
</response> 

我使用xmlllint此:

xmllint --noout --schema data.xsd data.[namespaced.].xml 

在此先感謝。

回答

1

取下xsd:schematargetNamespace屬性。然後您可以刪除elementFormDefault,因爲沒有目標名稱空間時它沒有區別。

在原來的架構與targetNamespace的聲明像

<xsd:element name="response"> 

聲明的元素,其本地名稱是response和其名稱空間URI http://myurl.com/response。命名空間URI是元素的完全限定名稱的組成部分,因此該模式將驗證具有相同的本地名稱,但是不同的(或空)命名空間的元素。相反,如果您刪除了目標名稱空間,那麼該模式將驗證非名稱空間文檔,但將驗證名稱空間的文檔,而不會驗證而不是

+0

繁榮。請解釋爲什麼targetNamespace是這個問題。 – chernevik

+0

啊。因此,使用{targetNamespace}修改元素的完全限定名稱,但方式不那麼容易看到。我發現有一點讓人困惑 - 架構沒有定義一個名稱空間嗎?但我想答案是,不,或者至少不完全。它是爲特定的命名空間定義結構。但是,是否要求受該結構約束的元素是該命名空間的_already_部分是一個選擇,由targetNamespace的行爲所支持。 – chernevik

+1

是的,命名空間很混亂。歡迎來到混淆名稱空間的世界。 –