2009-08-19 2 views
1

나는 내 문제에 대한 해결책은 매우 쉽게 생각하지만, 내가 그것을 FINT 수없는 그래서, 여기에 있습니다 : 요소의 목록을 가지고 내가 XML을XML 스키마 : 다른 요소 이름 (순서)

이름은 다르지만 순서대로. 예 : DOC_OBL_1, DOC_OBL_2 및 DOC_OBL_3 :

<DOC> 
<DOC_OBL_1> 
    <TIP_DOC_OBL>1</TIP_DOC_OBL> 
</DOC_OBL_1> 
<DOC_OBL_2> 
    <TIP_DOC_OBL>2</TIP_DOC_OBL> 
</DOC_OBL_2> 
<DOC_OBL_3> 
    <TIP_DOC_OBL>3</TIP_DOC_OBL> 
</DOC_OBL_3> 
</DOC> 

은 그래서, 3 개 요소가있다. 그리고 예, 숫자 4, 5, 6 등이있을 수 있습니다. 모두들 3 개가 같은 요소를 가지고 있습니다. (사실, 그것들은 많이 있지만, 지금은 중요하지 않습니다.) 저는 생각합니다. 이런 종류의 문서를 검증 할 수있는 일반적인 유형을 선언하십시오.

어떻게 이것을 스키마로 확인할 수 있습니까 ???

나는 그것의 아주 못생긴 XML을 알고있다. (어쩌면 표준이 아니다. 말해주지 말아라.) 나는이 문서를 작성하는 것이 내 관심사가 아니다. 나는 그것을 파싱하고 그것을 검증하고 변형시켜야한다.

답변

2

글쎄, 할 수있어! 아주 간단한 사실 : 구조는 각 요소에 대해 동일한 경우, 당신은 그 유효성을 검사 할 수있는 단일 <xs:complexType>를 정의 할 수 있습니다, 다음 사용

<?xml version="1.0" encoding="utf-8"?> 
<xs:schema id="DOC" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:element name="DOC"> 
    <xs:complexType> 
     <xs:sequence> 
     <xs:element name="DOC_OBL_1" type="DocType" /> 
     <xs:element name="DOC_OBL_2" type="DocType" /> 
     <xs:element name="DOC_OBL_3" type="DocType" /> 
     </xs:sequence> 
    </xs:complexType> 
    </xs:element> 
    <xs:complexType name="DocType"> 
    <xs:sequence> 
     <xs:element name="TIP_DOC_OBL" type="xs:string" minOccurs="0" /> 
    </xs:sequence> 
    </xs:complexType> 
</xs:schema> 

당신을 위해 그 일을합니까? 그것은 당신의 모든 요구를 다룰 수 있습니까?

Zach가 지적한 것처럼,이 "솔루션"은 태그 DOC_OBL_1, DOC_OBL_2, ..., DOC_OBL_x의 임의의 수를 처리 할 수 ​​없으므로 분명히 제한적입니다. 태그는 미리 알려야합니다.

이것은 불행한 일이지만,이 장애가있는 XML을 고려할 때 유일한 해결책입니다.

<DOC> 
    <DOC_OBL id="1"> 
    </DOC_OBL> 
    <DOC_OBL id="2"> 
    </DOC_OBL> 
    ..... 
    <DOC_OBL id="x"> 
    </DOC_OBL> 
</DOC> 

다음 XML 스키마보다 쉽게 ​​될 것입니다 및 <DOC_OBL> 태그의 수를 처리 할 수 ​​다음 REAL 솔루션은 같은 뭔가를하는 것입니다.

GIGO 원칙이 적용됩니다. Garbage In, Garbage Out ==> 진부한 XML 구조가 나오고, 진부하고 불완전한 유효성 검사 만 가능합니다.

마크

+1

@ marc_s DOC \ _OBL \ _1, DOC \ _OBL \ _2, DOC \ _OBL \ _N 노드가 여러 개있을 수있는 경우 요소 이름에 대해 일종의 정규식을 수행하는 스키마에 대해 유효성을 검사 할 수있는 방법이 있습니까? ? –

+0

아니, 안타깝게도 가능하지 않다. 나는 두렵다. 실제 태그 이름 만 요소 이름으로 가질 수 있습니다. 그런 다음 태그의 속성에 고정 태그 이름과 변수 부분 (순차 번호)이 있어야합니다. –

+0

고맙습니다. 적어도 50 개 요소 (DOC_OBL_1 ... DOC_OBL_50)로이 작업을 수행 할 것입니다. 추악한 입력 -> 추한 솔루션 .. : D 하지만 어쨌든 작동 할 수 있습니다. – eLZahR

2

그들에있는 그것의 불행한 XML 요소 이름이 기본적으로 가지고 일련 번호/식별자. XML (비표준)이 잘못 정의 된 것 같습니다.

내 제한된 (!) 환경에서 이것은 xsd 스키마가 시퀀스에 정의 된 가능한 모든 "DOC_OBL_N"요소를 가져야 함을 의미합니다. 이론적 인 숫자의 상한선이 없다면 아마 실용적이지 않을 것입니다.

유효한 XML 인 한,로드하고 요소 DOC의 모든 하위를 계산 한 다음 해당 스키마를 즉시 작성할 수 있지만 자체 패배와 비슷하게 들릴 수 있습니다.

일부 xpath를 사용하여 xml 인스턴스의 유효성을 수동으로 검사 할 수 있습니다. 일종의 무차별 접근 방식이며 기술적으로 xsd 스키마에 대해 유효성을 검사하지 않습니다.

+0

입력이 거대한 문서이므로 간단한 Schmea보다 더 많은 코드가 실행 가능하지 않습니다. – eLZahR