2012-03-01 14 views
1

我正在生成爲不同部分提供了不同XSD的XML文檔(也就是說,某些元素的定義在某些文件中,其他元素的定義在其他文件中)。使用三個xml模式作爲lxml中的一個組合模式進行驗證?

XSD文件不互相引用。該模式是:

  1. http://xmlgw.companieshouse.gov.uk/v2-1/schema/Egov_ch-v2-0.xsd
  2. http://xmlgw.companieshouse.gov.uk/v1-1/schema/forms/FormSubmission-v1-1.xsd
  3. http://xmlgw.companieshouse.gov.uk/v1-1/schema/forms/CompanyIncorporation-v1-2.xsd

有沒有一種方法來驗證對所有使用LXML的模式的文件?

這裏的解決方案是而不是只是針對每個模式單獨進行驗證,因爲我遇到的問題是驗證失敗,因爲未在XSD中指定的元素。例如,針對http://xmlgw.companieshouse.gov.uk/v2-1/schema/Egov_ch-v2-0.xsd驗證的時候,我得到的錯誤:

File "lxml.etree.pyx", line 3006, in lxml.etree._Validator.assertValid (src/lxml/lxml.etree.c:125415) 
DocumentInvalid: Element '{http://xmlgw.companieshouse.gov.uk}CompanyIncorporation': No matching global element declaration available, but demanded by the strict wildcard., line 9 

因爲有問題的文件包含一個{http://xmlgw.companieshouse.gov.uk}CompanyIncorporation元素,這是不是在XSD規定進行驗證的,但在其他XSD文件之一。

+0

你確定你不想來驗證*部分*的XML的文件反對*不同*模式,而不是*所有*模式針對*相同*文件? – 2012-03-02 16:38:26

+0

我確定我想檢查組合文檔是否有效。 – Marcin 2012-03-02 16:41:21

回答

3

我相信你應該只對Egov_ch-v2-0.xsd進行驗證,它似乎定義了一個信封文件。 (這是您正在創建的文檔,對嗎?您尚未顯示您的XML。)

此架構使用<xs:any namespace="##any" minOccurs="0"/>來定義信封的正文內容。但是,xsd:any確實是而不是的意思是「忽略所有內容」。相反,它的意思是「接受任何東西」。是否驗證或忽略內容由processContents屬性控制,該屬性默認爲strict。這意味着此處發現的任何元素必須根據架構可用的類型驗證。但是,Egov_ch-v2-0.xsd不會導入CompanyIncorporation-v1-2.xsd,因此它不知道CompanyIncorporation元素,因此文檔不驗證。

您需要將xsd:import元素添加到您的主模式(Egov_ch-v2-0.xsd)以導入可能在文檔中使用的所有其他模式。你可以做到這一點的XSD文件本身,也可以解析後以編程方式添加的元素:

xsd = lxml.etree.parse('http://xmlgw.companieshouse.gov.uk/v2-1/schema/Egov_ch-v2-0.xsd') 
newimport = lxml.etree.Element('{http://www.w3.org/2001/XMLSchema}import', 
    namespace="http://xmlgw.companieshouse.gov.uk", 
    schemaLocation="http://xmlgw.companieshouse.gov.uk/v1-1/schema/forms/CompanyIncorporation-v1-2.xsd") 
xsd.getroot().append(newimport) 

validator = lxml.etree.XMLSchema(xsd) 

你甚至可以做到這與採用的模式路徑的列表,並返回一個函數的通用方法列表xsd:import陳述與namespaceschemaLocation設置解析targetNamespace

(順便說一句,你應該下載這些架構文檔和文件系統路徑引用它們,而不是加載它們在網絡上。)

+0

謝謝你。是什麼引發了這個問題,這是行不通的,因爲驗證器在遇到未在其生成的XSD文檔中指定的元素時返回無效判定。我需要某種方式來創建組合的驗證器,瞭解所有三個XSD文件中的信息。我意識到這個問題的細節不在我原來的問題中。 – Marcin 2012-03-02 15:49:14

+0

然後該文檔對於該模式無效。是什麼讓你認爲它應該是有效的? XSD和XML文檔不能任意組合在一起。 – 2012-03-02 16:35:52

+0

是什麼讓我覺得它應該是有效的是被抱怨的元素顯示爲一個元素的內容,其內容被指定爲' '。 – Marcin 2012-03-02 16:40:17