2011-01-25 2 views
4

저는 파이썬에서 XML을 구문 분석하고 있습니다. XML 유효성을 검사하는 XSD 스키마가 있습니다. XSD에 정의 된대로 XML의 특정 노드 유형을 가져올 수 있습니까?XSD에 정의 된대로 XML 노드의 유형을 가져올 수 있습니까?

예를 들어, 내 XML (작은 부분) (다시 한번의 작은 부분) 내 XSD가

<deviceDescription> 
    <wakeupNote> 
    <lang xml:lang="ru">Русский</lang> 
    <lang xml:lang="en">English</lang> 
    </wakeupNote> 
</deviceDescription> 

입니다 :

<xsd:element name="deviceDescription" type="zwv:deviceDescription" minOccurs="0"/> 

<xsd:complexType name="deviceDescription"> 
    <xsd:sequence> 
    <xsd:element name="wakeupNote" type="zwv:description" minOccurs="0"> 
     <xsd:unique name="langDescrUnique"> 
     <xsd:selector xpath="zwv:lang"/> 
     <xsd:field xpath="@xml:lang"/> 
     </xsd:unique> 
    </xsd:element> 
    </xsd:sequence> 
</xsd:complexType> 

<xsd:complexType name="description"> 
    <xsd:sequence> 
    <xsd:element name="lang" maxOccurs="unbounded"> 
     <xsd:complexType> 
     <xsd:simpleContent> 
      <xsd:extension base="xsd:string"> 
      <xsd:attribute ref="xml:lang" use="required"/> 
      </xsd:extension> 
     </xsd:simpleContent> 
     </xsd:complexType> 
    </xsd:element> 
    </xsd:sequence> 
</xsd:complexType> 

구문 분석하는 동안 나는 알고 싶어요 내 태그 웨이크 업 노트은 XSD에서 complexType zwv : 설명으로 정의됩니다. 이 작업을 수행하는 방법 (파이썬에서)?

무엇이 필요합니까? 이 XML이 많이 있고 그 중 모두에 영어가 채워진 필드가 있는지 확인하고 싶습니다. <lang xml:lang="en"></lang>이 비어 있는지 쉽게 확인할 수 있지만이 태그를 전혀 지정하지 않아도됩니다.

따라서 언어 설명이있는 모든 태그를 가져 와서 <lang> 태그가 있는지 확인하고 ko에 대해 비어 있지 않은 콘텐츠가 있는지 확인하는 것이 좋습니다. 유효성 검사를하는 동안 내 XML이 XSD에 대해 검사되기 때문에

UPD

는 검증 엔진은 모든 노드의 유형을 알고있다. 7 개월 전에도 비슷한 질문이 있었는데 아직 답이 없습니다. 그것들은 관련되어있다. Validating and filling default values in XML based on XSD in Python

답변

0

질문 : 주어진 XML 노드의 유형 이름을 찾으려면 어떻게합니까? 답변은 xpath in python을 사용하여 찾아 보는 것입니다. xsd에서 실행할 xpath는

//element[@name='wakeupNote']/@type 

이 될 것이며, 이는 zwv : description을 반환해야합니다. 이 두 가지 유형을 반환하는 경우, 루트

/root/foo/wakeupNote (type A) 
/root/bar/wakeupNote (type B) 

이 루트에서 걷고 지루한 될 것입니다 도보해야합니다. 당신은 익명 및 명명 된 유형을 모두 찾아야합니다.

질문 : 주어진 유형의 모든 XML 노드를 찾으려면 어떻게합니까? 스키마가 자주 변경되는 경우 위의 방법으로 구문 분석 할 때 모든 노드의 유형을 테스트 할 수 있습니다.

스키마가 잘 알려져 있고 고정되어 있고 찾고있는 노드를 XPATH에서 찾을 수 있으면 각 노드를 테스트 할 수 있습니다.

//@xml:lang='en' 

그런 다음 파이썬을 사용하여 길이를 확인하십시오.

stable-schema의 경우 찾고있는 기준을 적용하는 두 번째 XSD를 작성할 수 있습니다.

+0

저는 XSD에 정의 된 모든 XML 노드를'zwv : description'로 찾고 싶습니다. XSD의 모든 정의가 아니라. 예를 들어, 내 XSD에서는'wakeupNote'를'zwv : description'으로'내부 deviceDescription'을 정의하고'zwv : shortdescription'으로 다른 태그 내부에 하나를 정의 할 수 있습니다. 따라서 필자의 XML에는 두 가지 유형의 'wakeupNote'가있다. 그리고 나는'zwv : description' 타입을 가진 사람들 만 선택해야합니다. 그것을하는 방법? – PoltoS

+0

수정 사항이 귀하의 필요를 충족시키지 않는 경우 의견을 추가하십시오. 질문과 답변을 명확히 할 기회를주지 말고 투표를하지 마십시오. –

+0

이 문제에 대해 더 많이 생각할수록 좋은 추천을하기 위해 유스 케이스를 이해해야합니다. 어떻게 XML을 파싱합니까? 스키마 변경 빈도 XSD는 귀하 또는 상대방입니까? 상대방 인 경우 추가 검증을 수행하는 이유는 무엇입니까? –

0

유효성 검사기는 유효성 검사기가 유효성을 검사하는 모든 요소와 특성의 형식 연결을 알고 있어야하며 유효성 검사기는 해당 정보에 대한 액세스를 제공 할 수있는 위치에 있어야합니다.

그러나 호출자와 유효성 검사기 간 API와 호출자가 사용할 수있는 유효성 검사 관련 정보를 모두 구현 정의한 것입니다. 일부 유효성 검사기 (Xerces J는 주목할만한 예입니다)는 매우 광범위한 유효성 검사 정보를 제공합니다. 다른 사람들은 그렇지 않습니다.

사용중인 유효성 검사기를 모른 채 아무도 찾고있는 유형 정보를 사용할 수 있는지 여부를 알 수 없습니다. 유효성 검사기를 호출하기 때문에 API가 있어야합니다. 형식 연결이 API를 통해 사용 가능하다면 아마도 문서에서 그렇게 말할 것입니다. API가 액세스를 제공하지 않으면 기본 스키마 유효성 검사기가 정보에 대한 액세스를 제공하지 않았거나 API 작성자가 포인트를 찾지 못했기 때문일 수 있습니다. 당신의 직업 (당신이 이것을 더 추구하기를 원한다면)은 그 중 어느 것이 그 것인지를 알아 내고 관련 당사자들에게 정보를 이용 가능하게하는 것이 유용 할 것이라는 것을 설득하려고 노력할 것입니다.

API를 통해 정보에 액세스 할 수있는 행운이 없다면 David W의 다른 대답에서 언급 한 좀 더 정교한 버전의 접근 방법을 사용하는 것이 좋습니다. XSD 스키마의 속성으로 통치 유형 모든 요소의 유효성 검사는 유효성 검사 루트에서 해당 요소에 대한 경로의 함수입니다. 따라서 원칙적으로 (실제로 약간 지루한 경우) 문서 인스턴스의 모든 요소에 대해 해당 통치 유형을 식별 할 수 있습니다. 문서 인스턴스가 특정 스키마에 대해 유효한지 여부. 예를 들어 언급 한 경우 wakeupNotedeviceDescription 또는 otherElement을 조상으로 사용하는지 또는 wakeupNote이 해당 조제를 사용하는지에 따라 더 가까운 조상 인 지 여부를 알 수 있고 해당 지식을 기반으로 적절한 통치 유형 정의를 추론 할 수 있습니다. .

이런 식으로 자신을 돕는 것은 사소한 작업량을 요구합니다. 이 정보를 계산하고 다양한 형태로 액세스 할 수있는 범용 도구가 있다면 도움이 될 것입니다. 그러나 그러한 정보가 있으면 그 정보를 모릅니다. (나는 그러한 도구를 유료로 만들 수있는 사람들을 알고있다.) 그래서 내가 당신이라면 먼저 API를 통해 정보를 얻으려고한다.

관련 문제