2012-12-14 33 views
9

XML dosyalarını doğrulamak için this tutorial'u takip ettim. Ancak XML dosyasını doğrularken istisna alıyorum. Ne yapıyorum yanlış? Benim kodları:
XML şeması:Java XML Şema doğrulaması: önek bağlı değil

<?xml version="1.0" encoding="utf-8" ?> 

<!-- definition of simple elements --> 
<xs:element name="first_name" type="xs:string" /> 
<xs:element name="last_name" type="xs:string" /> 
<xs:element name="phone" type="xs:string" /> 

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

<!-- definition of complex elements --> 

<xs:element name="reporter"> 
    <xs:complexType> 
     <xs:sequence> 
      <xs:element ref="first_name" /> 
      <xs:element ref="last_name" /> 
      <xs:element ref="phone" /> 
     </xs:sequence> 
    </xs:complexType> 
</xs:element> 

<xs:element name="report"> 
    <xs:complexType> 
     <xs:attribute ref="type"/> 
     <xs:attribute ref="date" /> 
     <xs:sequence> 
      <xs:element ref="reporter" /> 
     </xs:sequence> 
    </xs:complexType> 
</xs:element> 

XML dosyası doğrulamak için:

<?xml version="1.0" encoding="utf-8" ?> 
<report type="5" date="2012-12-14"> 
    <reporter> 
     <first_name>FirstName</firstname> 
     <last_name>Lastname</lastname> 
     <phone>+xxxxxxxxxxxx</phone> 
    </reporter> 
</report> 

Java kaynağını doğrulamak için:

import javax.xml.XMLConstants; 
import javax.xml.transform.Source; 
import javax.xml.transform.stream.StreamSource; 
import javax.xml.validation.*; 
import org.xml.sax.SAXException; 
import java.io.*; 

public class ProtocolValidator 
{ 
    public static void main(String [] args) throws Exception 
    { 
     Source schemaFile = new StreamSource(new File("schema.xsd")); 
     Source xmlFile = new StreamSource(new File("test_xml.xml")); 

     SchemaFactory schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); 
     Schema schema = schemaFactory.newSchema(schemaFile); 
     Validator validator = schema.newValidator(); 

     try{ 
      validator.validate(xmlFile); 
      System.out.println(xmlFile.getSystemId() + " is valid"); 
     } 
     catch (SAXException e) 
     { 
      System.out.println(xmlFile.getSystemId() + " is NOT valid"); 
      System.out.println("Reason: " + e.getLocalizedMessage()); 
     } 
    } 
} 

İstisna ben alıyorum:

Exception in thread "main" org.xml.sax.SAXParseException; systemId: file:/root/test/schema.xsd; lineNumber: 4; columnNumber: 50; The prefix "xs" for element "xs:element" is not bound. 
    at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.createSAXParseException(ErrorHandlerWrapper.java:198)... 

cevap

11

XML şema dosyasının kendisinin geçerli bir XML belgesi olması gerekiyor. Dış şema öğesini ve xs öneki için ad alanı bildirimini kaçırıyorsunuz.

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <!-- schema elements here --> 
</xs:schema> 
2

İlk sınırının altında, sizin şemaya bu satırı ekleyin:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 

... ve şemadaki son satır olarak bir kapatma etiketi:

</xs:schema> 
İlgili konular