2016-12-13 12 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ファイル検証するJavaプログラム:

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

は、ルート要素に属性elementFormDefault="qualified"を追加します。あなたのスキーマの

デフォルトは "unqualified"です。これは、デフォルト名前空間を指定するときには使用できません。

また、あなたがあるとして、あなたのスキーマを残さない、と修飾されていない形式を使用するドキュメントを更新(デフォルトの名前空間を、そして唯一のグローバル要素を修飾)ができます

<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文書が入っています"修飾された"形式。すべての要素は明示的にネームスペースに関連付けられています。この名前空間はデフォルトの-を指定することで行いました。

上記のxmlは「非修飾」形式です。グローバル要素(すなわち、スキーマの最上位要素)は修飾されなければならないが、ローカル要素(すなわち、スキーマの入れ子要素)でなければならない。 "非修飾"形式では、ローカル要素は、囲むグローバル要素の名前空間に暗黙的に関連付けられます。

名前空間接頭辞なしの要素と名前空間を明示的に関連付けているため、「修飾されていない」を使用するドキュメントではデフォルトの名前空間を使用できません。それを「空の接頭辞」と名前空間を関連付けるものと考えてください。

一般に、「修飾された」フォーマットが使用するのが最も簡単です。

+0

ご回答いただきありがとうございます。 'unqualified'を使用している場合、私のXML文書はどのように見えますか? – zilcuanu

+0

元のドキュメントは「修飾」形式です。答えのドキュメントは「非修飾」形式です(グローバル要素「student」で使用される接頭辞、ローカル要素に接頭辞がないこと、デフォルトがないことに注意してください)名前空間)。私はいくつかのさらなる説明で答えを更新しました。 – teppic

関連する問題