2012-03-01 3 views
1

다른 부분에 다른 XSD가 제공된 XML 문서를 생성 중입니다. 즉, 일부 요소에 대한 정의가 특정 파일에 있고, 다른 요소에 대한 정의가 다른 파일에 있습니다.lxml에서 하나의 결합 스키마로 3 개의 xml 스키마로 유효성을 검사합니까?

XSD 파일이 서로를 참조하지 않습니다. 스키마는 다음과 같습니다 LXML를 사용하여 모든 스키마에 대한 문서를 검증 할 수있는 방법이

  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

있습니까?

해결 방법은 아니요입니다. 각 스키마에 대해 개별적으로 유효성을 검사하기 만하면됩니다. 그 이유는 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 

문제의 문서에 대해 검증되는 XSD에 지정되지 않은 {http://xmlgw.companieshouse.gov.uk}CompanyIncorporation 요소를 포함하고 있기 때문에, 그러나 다른 XSD 파일 중 하나에 : http://xmlgw.companieshouse.gov.uk/v2-1/schema/Egov_ch-v2-0.xsd에 대해 유효성을 검사 할 때 예를 들어, 나는 오류가 발생합니다.

+0

당신이 당신이 * 부분을 확인하지 않으 있습니까 *는 XML의 * 같은 * 문서에 대한 * 모든 * 스키마가 아닌 * 다른 스키마에 대한 문서? –

+0

결합 된 문서가 유효한지 확인하고 싶습니다. – Marcin

답변

3

저는 봉투 문서를 정의하는 것으로 보이는 Egov_ch-v2-0.xsd에 대해서만 유효성을 검사해야한다고 생각합니다. 이 문서는 <xs:any namespace="##any" minOccurs="0"/>을 사용하여 봉투의 본문 내용을 정의합니다. 그러나 xsd:any이 아니며은 "모든 내용 무시"를 의미합니다. 오히려 그것은 "여기에 무엇이든 받아들이십시오"을 의미합니다. 내용의 유효성을 검사할지 또는 무시할지 여부는 processContents 특성에 의해 제어되며 기본값은 strict입니다. 즉, 여기서 발견 된 요소는 이어야하며은 스키마에서 사용 가능한 유형에 대해 유효성을 검사해야합니다. 그러나 Egov_ch-v2-0.xsdCompanyIncorporation-v1-2.xsd을 가져 오지 않으므로 CompanyIncorporation 요소에 대해 알지 못하므로 문서의 유효성을 검사하지 않습니다.

기본 스키마 (Egov_ch-v2-0.xsd)에 xsd:import 요소를 추가하여 문서에서 사용할 수있는 다른 모든 스키마를 가져와야합니다. 당신은 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) 

당신은 심지어 스키마 경로의 목록을 취하고을 반환하는 기능을 가진 일반적인 방법으로이 작업을 수행 할 수 있습니다 targetNamespace을 구문 분석하여 namespaceschemaLocation이 설정된 xsd:import 문 목록입니다.

(여담으로, 당신은 아마 이러한 스키마 문서를 다운로드하고 네트워크를 통해 파일 시스템 경로로 참조보다는를로드해야합니다.)

+0

감사합니다. 질문을 던지는 메시지는 생성자가 생성 한 XSD 문서 내에 지정되지 않은 요소를 만났을 때 유효성 검사기가 유효하지 않은 판정을 반환하기 때문에 단순히 작동하지 않는다는 것입니다.세 가지 XSD 파일의 정보를 알고있는 조합 된 유효성 검사기를 만드는 방법이 필요합니다. 나는 그 문제의 세부 사항이 원래의 질문에 있지 않다는 것을 알고 있습니다. – Marcin

+0

그런 다음 해당 스키마에 대해 문서가 유효하지 않습니다. 그게 유효하다고 생각하는 이유는 무엇입니까? XSD와 XML 문서는 임의로 함께 구성 될 수 없습니다. –

+0

그것이 유효해야한다고 생각하는 것은 불만을 제기하는 요소가 내용이 로 지정된 요소의 내용으로 나타나는 것입니다. '. – Marcin

관련 문제