2016-12-13 4 views
3

저는 XSD을 처음 접합니다. XSD 파일과 XML 파일 및 XSD에 대해 XML의 유효성을 검사하는 프로그램을 작성했습니다. 프로그램을 실행할 때 Invalid content was found starting with element 'id'. One of '{id}' is expected이라는 오류 메시지가 나타납니다. 누군가 내가 잘못 가고있는 곳을 설명해 줄 수 있습니까?xsd에 대한 xml의 유효성을 검사 할 수 없습니다

XSD 파일 :

<?xml version="1.0" encoding="UTF-8"?> 
    <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
       targetNamespace="http://www.edureka.co/Student" 
       xmlns:st="http://www.edureka.co/Student" 
       > 
     <xs:element name="student" type="st:student"></xs:element> 
      <xs:complexType name="student"> 
       <xs:sequence> 
        <xs:element name="id" type="xs:int"/> 
        <xs:element name="name" type="xs:string"/> 
        <xs:element name="language" type="xs:string"/> 
        <xs:element name="expertise" type="xs:string"/> 
       </xs:sequence> 
      </xs:complexType> 
     </xs:schema> 

그리고 XML 파일 :

<?xml version="1.0" encoding="UTF-8"?> 
    <student xmlns="http://www.edureka.co/Student" 
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      xsi:schemaLocation="http://www.edureka.co/Student studentRule.xsd" 
      > 

     <id>1234</id> 
     <name>Pradeep</name> 
     <language>Sanskrit</language> 
     <expertise>Beginner</expertise> 
    </student> 

XML 파일의 유효성을 검사하는 자바 프로그램 : 루트 요소에 속성 elementFormDefault="qualified" 추가

import java.io.File; 
import java.io.IOException; 

import javax.xml.XMLConstants; 
import javax.xml.transform.stream.StreamSource; 
import javax.xml.validation.Schema; 
import javax.xml.validation.SchemaFactory; 
import javax.xml.validation.Validator; 

import org.xml.sax.SAXException; 

public class ValidatorDemo { 

    public static void main(String[] args) { 

     System.out.println("student.xml validates against studentRule.xsd? "+validateXMLSchema("studentRule.xsd", "student.xml")); 

     } 

    public static boolean validateXMLSchema(String xsdPath, String xmlPath){ 

     try { 
      SchemaFactory factory = 
        SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); 
      Schema schema = factory.newSchema(new File(xsdPath)); 
      Validator validator = schema.newValidator(); 
      validator.validate(new StreamSource(new File(xmlPath))); 
     } catch (IOException | SAXException e) { 
      System.out.println("Exception: "+e.getMessage()); 
      return false; 
     } 
     return true; 
    } 
} 

답변

3

을 귀하의 스키마.

기본값은 "비 한정"이며 기본 네임 스페이스를 지정할 때 사용할 수 없습니다. 또한

, 당신은 귀하의 스키마를두고 규정되지 않은 형식을 사용하는 문서를 업데이트 (NO 기본 네임 스페이스를, 만 글로벌 요소를 자격) 수 : 당신이 게시

<st:student xmlns:st="http://www.edureka.co/Student" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="http://www.edureka.co/Student studentRule.xsd" 
     > 

    <id>1234</id> 
    <name>Pradeep</name> 
    <language>Sanskrit</language> 
    <expertise>Beginner</expertise> 
</st:student> 

XML 문서가에 "자격을 갖춘"형식; 모든 요소는 명시 적으로 네임 스페이스와 연결되어 있습니다.이 네임 스페이스는 기본값 - xmlns="http://www.edureka.co/Student"을 지정하여 수행했습니다.

위의 XML은 "규정되지 않은"형식입니다. 전역 요소 (예 : 스키마의 최상위 요소)는 정규화되어야하지만 로컬 요소 (스키마의 중첩 요소) 이어야합니다. "규정되지 않은"형식에서 로컬 요소는 내포 글로벌 요소의 네임 스페이스와 함축적으로 연관됩니다.

"네임 스페이스 접두사가없는 요소를 네임 스페이스와 명시 적으로 연결하기 때문에"정규화되지 않은 "을 사용하는 문서에서는 기본 네임 스페이스를 사용할 수 없습니다. "빈 접두어"를 네임 스페이스와 연결하는 것으로 생각하십시오.

일반적으로 "정규화 된"형식이 가장 쉽게 사용할 수 있습니다.

+0

응답 해 주셔서 감사합니다. 'unqualified'를 사용하고 있다면 XML 문서는 어떻게 보이겠습니까? – zilcuanu

+0

원본 문서가 "정규화 된"형식이고 응답의 문서가 "규정되지 않은"형식입니다 (전역 요소 "student"에 사용 된 접두어, 로컬 요소에 접두어가없는 것과 기본 네임 스페이스). 좀 더 자세한 설명으로 답변을 업데이트했습니다. – teppic