2013-05-05 2 views
2

xs : choice 요소를 사용하려하지만 XSD 파일의 유효성을 검사하는 동안 xs : choice 요소와 관련 있다고 생각되는 오류가 발생합니다. 나는이 문제를 꽤 많이 찾았고 비슷한 것을 찾았지만 내 문제를 해결하기 위해 내가 찾던 답을주지 않았다.XML 스키마 xs : xs : sequence 내부의 선택

내가하려고하는 것은 "데이터"라는 요소를 선언하는 것입니다. 자식 요소는 타임 스탬프와 센서 또는 공급자가 될 것입니다 (여기서 나는 선택 요소를 사용하려고합니다. 센서 또는 제공자 요소를 타임 스탬프의 형제로 사용하려는 경우).

은 다음 XML 내가 검증하기 위해 노력하고있어입니다 :

<?xml version="1.0" encoding="ISO-8859-1"?> 
<experience xmlns="http://www.w3schools.com" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" > 
<data> 
    <timestamp>123456789</timestamp> 
    <sensor origin="proximity" > 
     <x-axis>9</x-axis> 
     <y-axis>0</y-axis> 
     <z-axis>0</z-axis> 
     <w-axis>0</w-axis> 
    </sensor> 
</data> 
</experience> 

그리고이 XML의 유효성을 확인하기 위해를, 나는 다음과 같은 XSD 파일 작성 :

<?xml version="1.0" encoding="ISO-8859-1" ?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 

<!-- definition of attributes --> 
<xs:attribute name="origin" type="xs:string" /> 

<!-- definition of complex elements --> 
    <xs:element name="provider"> 
     <xs:complexType> 
      <xs:all> 
       <xs:element name="latitude" type="xs:float" /> 
       <xs:element name="longitude" type="xs:float" /> 
       <xs:element name="altitude" type="xs:float" /> 
       <xs:element name="bearing" type="xs:float" /> 
       <xs:element name="speed"  type="xs:float" /> 
      </xs:all> 
      <xs:attribute ref="origin" use="required"/> 
     </xs:complexType> 
    </xs:element> 

    <xs:element name="sensor"> 
     <xs:complexType> 
      <xs:all> 
       <xs:element name="x-axis" type="xs:float" /> 
       <xs:element name="y-axis" type="xs:float" /> 
       <xs:element name="z-axis" type="xs:float" /> 
       <xs:element name="w-axis" type="xs:float" /> 
      </xs:all> 
      <xs:attribute ref="origin" use="required"/> 
     </xs:complexType> 
    </xs:element> 

    <xs:element name="data"> 
     <xs:complexType> 
      <xs:sequence> 
       <xs:element ref="timestamp" minOccurs="1" maxOccurs="1" /> 

       <xs:choice> 
        <element ref="provider" /> 
        <element ref="sensor" /> 
       </xs:choice> 
      </xs:sequence> 
     </xs:complexType> 
    </xs:element> 

<!-- definition of main type --> 
    <xs:element name="experience"> 
     <xs:complexType> 
      <xs:sequence> 
       <xs:element ref="data" minOccurs="0" maxOccurs="unbounded"/> 
      </xs:sequence> 
     </xs:complexType> 
    </xs:element> 
</xs:schema> 

을하지만 난을 업로드하면 파일과 following w3 website를 사용하여 유효성을 검사 할, 나는 다음과 같은 오류 얻을 :

file:/usr/local/XSV/xsvlog/tmph7cMmLuploaded:45:6: Invalid per cvc-complex-type.1.2.4: element {None}:element not allowed here (1) in element { http://www.w3.org/2001/XMLSchema }:choice, expecting [{ http://www.w3.org/2001/XMLSchema }:annotation,$,{ http://www.w3.org/2001/XMLSchema }:element,{ http://www.w3.org/2001/XMLSchema }:group,{ http://www.w3.org/2001/XMLSchema }:choice,{ http://www.w3.org/2001/XMLSchema }:sequence,{ http://www.w3.org/2001/XMLSchema }:any]:

I을 문제가 xs : choice 요소에 있다고 생각하지만 잘못된 것일 수 있습니다.

처음으로 xs : choice 요소를 사용하려고했기 때문에 올바르게 사용하는지 여부를 의심 스럽습니다. w3schools의 예에 따르면 나는 다른 요소 옆에서 사용하려고하기 때문에 더 이상 올바른지 모르겠습니다.

누군가가이 웹 사이트에서 나를 도울 수 있다면 매우 감사하겠습니다.

미리 감사드립니다.

답변

2

XML 및 XSD에 일부 움직이는 타겟이 있습니다. 그래서 XSD 아래 XML은 둘 다 최소한 ... 서로 일치하도록 수정

수정 된 XSD :

<?xml version="1.0" encoding="utf-8" ?> 
<!-- XML Schema generated by QTAssistant/XSD Module (http://www.paschidev.com) --> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns="http://www.w3schools.com" targetNamespace="http://www.w3schools.com" elementFormDefault="qualified"> 

    <!-- definition of attributes --> 
    <xs:attribute name="origin" type="xs:string"/> 

    <!-- definition of complex elements --> 
    <xs:element name="provider"> 
     <xs:complexType> 
      <xs:all> 
       <xs:element name="latitude" type="xs:float"/> 
       <xs:element name="longitude" type="xs:float"/> 
       <xs:element name="altitude" type="xs:float"/> 
       <xs:element name="bearing" type="xs:float"/> 
       <xs:element name="speed" type="xs:float"/> 
      </xs:all> 
      <xs:attribute ref="origin" use="required"/> 
     </xs:complexType> 
    </xs:element> 

    <xs:element name="sensor"> 
     <xs:complexType> 
      <xs:all> 
       <xs:element name="x-axis" type="xs:float"/> 
       <xs:element name="y-axis" type="xs:float"/> 
       <xs:element name="z-axis" type="xs:float"/> 
       <xs:element name="w-axis" type="xs:float"/> 
      </xs:all> 
      <xs:attribute ref="origin" use="required"/> 
     </xs:complexType> 
    </xs:element> 
    <xs:element name="timestamp" type="xs:long"/> 

    <xs:element name="data"> 
     <xs:complexType> 
      <xs:sequence> 
       <xs:element ref="timestamp" minOccurs="1" maxOccurs="1"/> 

       <xs:choice> 
        <xs:element ref="provider"/> 
        <xs:element ref="sensor"/> 
       </xs:choice> 
      </xs:sequence> 
     </xs:complexType> 
    </xs:element> 

    <!-- definition of main type --> 
    <xs:element name="experience"> 
     <xs:complexType> 
      <xs:sequence> 
       <xs:element ref="data" minOccurs="0" maxOccurs="unbounded"/> 
      </xs:sequence> 
     </xs:complexType> 
    </xs:element> 
</xs:schema> 

수정 된 XML :

<?xml version="1.0" encoding="ISO-8859-1"?> 
<experience xmlns="http://www.w3schools.com" xmlns:tns="http://www.w3schools.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <data> 
     <timestamp>123456789</timestamp> 
     <sensor tns:origin="proximity"> 
      <x-axis>9</x-axis> 
      <y-axis>0</y-axis> 
      <z-axis>0</z-axis> 
      <w-axis>0</w-axis> 
     </sensor> 
    </data> 
</experience> 

그래서 이런 것입니다 :

  • XML이 기본 XML 네임 스페이스를 정의합니다. 따라서 XSD는 일치하는 네임 스페이스를 정의해야하므로 새 targetNamespace 속성과 그에 일치하는 기본 xmlns를 추가하십시오. 모든 요소는 다음 스키마 선택에 귀하의 문제는 당신이 등, &lt;element ref="provider" 가지고있다 elementFormDefault="qualified"

  • 를 사용해야합니다 (인해 루트 수준에서 기본 네임 스페이스의 사용) 자격이 있기 때문에

  • 하는 xs : 한정자가 필요합니다 (사용자가 제공 한 오류의 요지입니다)

  • XSD에 timestamp 요소를 추가했습니다.

이러한 변경 사항으로 인해 이제 문제가 XML, 특히 원본 속성이됩니다.특성을 전역으로 선언 했으므로 XSD의 네임 스페이스에서 정규화되어야합니다. 그러므로 xmln:tns=... 및 fixin을 추가하십시오. tns:origin=...

XML을 변경하지 않으려면 XSD가 다음 중 하나를 정의해야합니다 (참조하는 대신) 로컬로 속성을 지정하거나 그룹으로 속성을 래핑하고 대신 참조 할 수 있습니다. 따라서 여기에 원본 XML과 일치하는 업데이트 된 XSD가 있습니다.

<?xml version="1.0" encoding="utf-8" ?> 
<!-- XML Schema generated by QTAssistant/XSD Module (http://www.paschidev.com) --> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns="http://www.w3schools.com" targetNamespace="http://www.w3schools.com" elementFormDefault="qualified"> 
    <xs:attributeGroup name="origin"> 
     <!-- definition of attributes --> 
     <xs:attribute name="origin" type="xs:string"/>  
    </xs:attributeGroup> 

    <!-- definition of complex elements --> 
    <xs:element name="provider"> 
     <xs:complexType> 
      <xs:all> 
       <xs:element name="latitude" type="xs:float"/> 
       <xs:element name="longitude" type="xs:float"/> 
       <xs:element name="altitude" type="xs:float"/> 
       <xs:element name="bearing" type="xs:float"/> 
       <xs:element name="speed" type="xs:float"/> 
      </xs:all> 
      <xs:attributeGroup ref="origin"/> 
     </xs:complexType> 
    </xs:element> 

    <xs:element name="sensor"> 
     <xs:complexType> 
      <xs:all> 
       <xs:element name="x-axis" type="xs:float"/> 
       <xs:element name="y-axis" type="xs:float"/> 
       <xs:element name="z-axis" type="xs:float"/> 
       <xs:element name="w-axis" type="xs:float"/> 
      </xs:all> 
      <xs:attributeGroup ref="origin"/> 
     </xs:complexType> 
    </xs:element> 
    <xs:element name="timestamp" type="xs:long"/> 

    <xs:element name="data"> 
     <xs:complexType> 
      <xs:sequence> 
       <xs:element ref="timestamp" minOccurs="1" maxOccurs="1"/> 

       <xs:choice> 
        <xs:element ref="provider"/> 
        <xs:element ref="sensor"/> 
       </xs:choice> 
      </xs:sequence> 
     </xs:complexType> 
    </xs:element> 

    <!-- definition of main type --> 
    <xs:element name="experience"> 
     <xs:complexType> 
      <xs:sequence> 
       <xs:element ref="data" minOccurs="0" maxOccurs="unbounded"/> 
      </xs:sequence> 
     </xs:complexType> 
    </xs:element> 
</xs:schema> 
+0

우선 감사합니다. 타임 스탬프를 정의하는 것을 잊어 버렸지 만 이미 게시했습니다. 그게 내 문제를 해결해 줬어. XML 파일이 있거나 XML 파일을 작성하고 유효성을 검사하려는 사용자가 온라인으로 XSD를 확인할 수 있도록 내 xsd를 온라인에 연결하려고합니다. "http://mywebsite.com:123/schema/myxsd.xsd"에서 사용할 수 있다고 가정 해 봅시다. 이 링크가 내 XML 파일에 정의되어 있는지, "schemaLocation"이라는 속성이 있다는 것을 알고 있습니다. –

+0

예, xsi : schemaLocation 속성을 사용하여 XML 파일에서 참조 할 수 있습니다 ... 특히 모든 프로세서가 자동으로이 위치를 따르지는 않기 때문에 항상 작동하지 않을 수 있습니다 (특히 원격 위치에있는 경우) ... 그래도 좋은 점은 문서화 방법 ... 제가 개인적으로 좋아하는 또 다른 메커니즘은 XSD의 targetNamespace가 XSD의 위치로 실제로 참조 해제 될 수있는 경우입니다 ... –

+0

다시 한번 감사드립니다 @PetruGardea! ;) –

관련 문제