Java by API/javax.xml.validation/SchemaFactory

Материал из Java эксперт
Перейти к: навигация, поиск

SchemaFactory: newInstance(String schemaLanguage)

   <source lang="java">

/* Parser object is: com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl@c9ba38 Start document: Start element: local name: PHONEBOOK qname: PHONEBOOK uri: Characters: Start element: local name: PERSON qname: PERSON uri: Characters: Start element: local name: NAME qname: NAME uri: Attributes:

 Name : firstName
 Type : CDATA
 Value: Joe
 Name : lastName
 Type : CDATA
 Value: Yin

Characters: Joe Characters: Yin End element: local name: NAME qname: NAME uri: Characters: Start element: local name: EMAIL qname: EMAIL uri: Characters: joe@yourserver.ru End element: local name: EMAIL qname: EMAIL uri: Characters: Start element: local name: TELEPHONE qname: TELEPHONE uri: Characters: 202-999-9999 End element: local name: TELEPHONE qname: TELEPHONE uri: Characters: Start element: local name: WEB qname: WEB uri: Characters: www.jexp.ru End element: local name: WEB qname: WEB uri: Characters: End element: local name: PERSON qname: PERSON uri: Characters: End element: local name: PHONEBOOK qname: PHONEBOOK uri: End document:

*/

import java.io.StringReader; import javax.xml.XMLConstants; import javax.xml.parsers.ParserConfigurationException; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; import javax.xml.transform.sax.SAXSource; import javax.xml.validation.SchemaFactory; import org.xml.sax.Attributes; import org.xml.sax.InputSource; import org.xml.sax.SAXException; import org.xml.sax.SAXParseException; import org.xml.sax.helpers.DefaultHandler; public class MainClass {

 public static void main(String args[])throws Exception {
   SAXParserFactory spf = SAXParserFactory.newInstance();
   SAXParser parser = null;
   spf.setNamespaceAware(true);
   try {
    SchemaFactory sf =
                    SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); 
    spf.setSchema(sf.newSchema(new SAXSource(new InputSource(new StringReader(schemaString)))));
    parser = spf.newSAXParser();
   }
   catch(SAXException e) {
     e.printStackTrace(System.err);
     System.exit(1);    
   } 
   catch(ParserConfigurationException e) {
     e.printStackTrace(System.err);
     System.exit(1);    
   }
   MySAXHandler handler = new MySAXHandler(); 
   System.out.println(schemaString);
   parser.parse(new InputSource(new StringReader(xmlString)), handler);
 }
 static String xmlString = "<?xml version=\"1.0\"?>" +
     "<note>" +
     "<to>rtoName</to>" +
     "<from>FromName</from>" +
     "<heading>Info</heading>" +
     "<body>Message Body</body>" +
     "</note>";
 
 static String schemaString ="<?xml version=\"1.0\"?>" +
     "<xs:schema xmlns:xs=\"http://www.w3.org/2001/XMLSchema\"" +
     " targetNamespace=\"http://www.jexp.ru\"" +
     " xmlns=\"http://www.jexp.ru\"" +
     " elementFormDefault=\"qualified\">" +
     "<xs:element name=\"note\">" +
     "<xs:complexType>" +
     "<xs:sequence>" +
     "<xs:element name=\"to\" type=\"xs:string\"/>" +
     "<xs:element name=\"from\" type=\"xs:string\"/>" +
     "<xs:element name=\"heading\" type=\"xs:string\"/>" +
     "<xs:element name=\"body\" type=\"xs:string\"/>" +
     "</xs:sequence>" +
                     "</xs:complexType>" +
                     "</xs:element>" +
                     "</xs:schema>";

} class MySAXHandler extends DefaultHandler {

 public void startDocument() {
   System.out.println("Start document: ");
 }    
   public void endDocument()  {
   System.out.println("End document: ");
 }
 
 public void startElement(String uri, String localName, String qname, 
                                                              Attributes attr)
 {
   System.out.println("Start element: local name: " + localName + " qname: " 
                                                       + qname + " uri: "+uri);
   int attrCount = attr.getLength();
   if(attrCount>0) {
     System.out.println("Attributes:"); 
     for(int i = 0 ; i<attrCount ; i++) {
       System.out.println("  Name : " + attr.getQName(i)); 
       System.out.println("  Type : " + attr.getType(i)); 
       System.out.println("  Value: " + attr.getValue(i)); 
     }
   } 
 }
 
 public void endElement(String uri, String localName, String qname) {
   System.out.println("End element: local name: " + localName + " qname: "
                                                        + qname + " uri: "+uri);
 }
 
 public void characters(char[] ch, int start, int length) {
   System.out.println("Characters: " + new String(ch, start, length));
 }
 public void ignorableWhitespace(char[] ch, int start, int length) {
   System.out.println("Ignorable whitespace: " + new String(ch, start, length));
 }
 public void startPrefixMapping(String prefix, String uri) {
   System.out.println("Start \"" + prefix + "\" namespace scope. URI: " + uri); 
 }
 public void endPrefixMapping(String prefix) {
   System.out.println("End \"" + prefix + "\" namespace scope."); 
 }
 public void warning(SAXParseException spe) {
   System.out.println("Warning at line "+spe.getLineNumber());
   System.out.println(spe.getMessage());
 }
 public void fatalError(SAXParseException spe) throws SAXException {
   System.out.println("Fatal error at line "+spe.getLineNumber());
   System.out.println(spe.getMessage());
   throw spe;
 }

}


 </source>
   
  
 
  



SchemaFactory: newSchema(File schema) throws SAXException

   <source lang="java">
 

import java.io.File; import javax.xml.XMLConstants; import javax.xml.bind.JAXBContext; import javax.xml.bind.JAXBException; import javax.xml.bind.Marshaller; import javax.xml.bind.ValidationEvent; import javax.xml.bind.ValidationEventHandler; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement; import javax.xml.bind.annotation.XmlType; import javax.xml.bind.annotation.XmlValue; import javax.xml.validation.Schema; import javax.xml.validation.SchemaFactory; public class MarshalValidation {

 public static void main(String[] args) throws Exception {
   Person p = new Person();
   p.setFirstName("B");
   p.setLastName("H");
   JAXBContext context = JAXBContext.newInstance(Person.class);
   Marshaller marshaller = context.createMarshaller();
   SchemaFactory sf = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
   Schema schema = sf.newSchema(new File("person.xsd"));
   marshaller.setSchema(schema);
   marshaller.setEventHandler(new ValidationEventHandler() {
     public boolean handleEvent(ValidationEvent event) {
       System.out.println(event);
       return false;
     }
   });
   marshaller.marshal(p, System.out);
 }

} @XmlRootElement() @XmlType(name = "") // @XmlAccessorType(XmlAccessType.FIELD) class Person {

 // @XmlAttribute()
 private String firstName;
 private PersonName friend;
 private String lastName;
 public String getFirstName() {
   return firstName;
 }
 @XmlElement(nillable = true)
 // @XmlElement(required=true)
 public PersonName getFriend() {
   return friend;
 }
 // @XmlValue()
 // @XmlTransient
 public String getLastName() {
   return lastName;
 }
 public void setFirstName(String s) {
   firstName = s;
 }
 public void setFriend(PersonName friend) {
   this.friend = friend;
 }
 // r @XmlTransient
 public void setLastName(String s) {
   lastName = s;
 }

} @XmlRootElement @XmlAccessorType(XmlAccessType.NONE) class PersonName {

 @XmlValue
 private String value;
 public String getValue() {
   return value;
 }
 public void setValue(String value) {
   this.value = value;
 }
 public static void main(String[] args) throws JAXBException {
   PersonName pn = new PersonName();
   pn.value = "foo";
   JAXBContext context = JAXBContext.newInstance(PersonName.class);
   context.createMarshaller().marshal(pn, System.out);
 }

}


 </source>
   
  
 
  



SchemaFactory: newSchema(Source schema)

   <source lang="java">

/* Parser object is: com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl@c9ba38 Start document: Start element: local name: PHONEBOOK qname: PHONEBOOK uri: Characters: Start element: local name: PERSON qname: PERSON uri: Characters: Start element: local name: NAME qname: NAME uri: Attributes:

 Name : firstName
 Type : CDATA
 Value: Joe
 Name : lastName
 Type : CDATA
 Value: Yin

Characters: Joe Characters: Yin End element: local name: NAME qname: NAME uri: Characters: Start element: local name: EMAIL qname: EMAIL uri: Characters: joe@yourserver.ru End element: local name: EMAIL qname: EMAIL uri: Characters: Start element: local name: TELEPHONE qname: TELEPHONE uri: Characters: 202-999-9999 End element: local name: TELEPHONE qname: TELEPHONE uri: Characters: Start element: local name: WEB qname: WEB uri: Characters: www.jexp.ru End element: local name: WEB qname: WEB uri: Characters: End element: local name: PERSON qname: PERSON uri: Characters: End element: local name: PHONEBOOK qname: PHONEBOOK uri: End document:

*/

import java.io.StringReader; import javax.xml.XMLConstants; import javax.xml.parsers.ParserConfigurationException; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; import javax.xml.transform.sax.SAXSource; import javax.xml.validation.SchemaFactory; import org.xml.sax.Attributes; import org.xml.sax.InputSource; import org.xml.sax.SAXException; import org.xml.sax.SAXParseException; import org.xml.sax.helpers.DefaultHandler; public class MainClass {

 public static void main(String args[])throws Exception {
   SAXParserFactory spf = SAXParserFactory.newInstance();
   SAXParser parser = null;
   spf.setNamespaceAware(true);
   try {
    SchemaFactory sf =
                    SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); 
    spf.setSchema(sf.newSchema(new SAXSource(new InputSource(new StringReader(schemaString)))));
    parser = spf.newSAXParser();
   }
   catch(SAXException e) {
     e.printStackTrace(System.err);
     System.exit(1);    
   } 
   catch(ParserConfigurationException e) {
     e.printStackTrace(System.err);
     System.exit(1);    
   }
   MySAXHandler handler = new MySAXHandler(); 
   System.out.println(schemaString);
   parser.parse(new InputSource(new StringReader(xmlString)), handler);
 }
 static String xmlString = "<?xml version=\"1.0\"?>" +
     "<note>" +
     "<to>rtoName</to>" +
     "<from>FromName</from>" +
     "<heading>Info</heading>" +
     "<body>Message Body</body>" +
     "</note>";
 
 static String schemaString ="<?xml version=\"1.0\"?>" +
     "<xs:schema xmlns:xs=\"http://www.w3.org/2001/XMLSchema\"" +
     " targetNamespace=\"http://www.jexp.ru\"" +
     " xmlns=\"http://www.jexp.ru\"" +
     " elementFormDefault=\"qualified\">" +
     "<xs:element name=\"note\">" +
     "<xs:complexType>" +
     "<xs:sequence>" +
     "<xs:element name=\"to\" type=\"xs:string\"/>" +
     "<xs:element name=\"from\" type=\"xs:string\"/>" +
     "<xs:element name=\"heading\" type=\"xs:string\"/>" +
     "<xs:element name=\"body\" type=\"xs:string\"/>" +
     "</xs:sequence>" +
                     "</xs:complexType>" +
                     "</xs:element>" +
                     "</xs:schema>";

} class MySAXHandler extends DefaultHandler {

 public void startDocument() {
   System.out.println("Start document: ");
 }    
   public void endDocument()  {
   System.out.println("End document: ");
 }
 
 public void startElement(String uri, String localName, String qname, 
                                                              Attributes attr)
 {
   System.out.println("Start element: local name: " + localName + " qname: " 
                                                       + qname + " uri: "+uri);
   int attrCount = attr.getLength();
   if(attrCount>0) {
     System.out.println("Attributes:"); 
     for(int i = 0 ; i<attrCount ; i++) {
       System.out.println("  Name : " + attr.getQName(i)); 
       System.out.println("  Type : " + attr.getType(i)); 
       System.out.println("  Value: " + attr.getValue(i)); 
     }
   } 
 }
 
 public void endElement(String uri, String localName, String qname) {
   System.out.println("End element: local name: " + localName + " qname: "
                                                        + qname + " uri: "+uri);
 }
 
 public void characters(char[] ch, int start, int length) {
   System.out.println("Characters: " + new String(ch, start, length));
 }
 public void ignorableWhitespace(char[] ch, int start, int length) {
   System.out.println("Ignorable whitespace: " + new String(ch, start, length));
 }
 public void startPrefixMapping(String prefix, String uri) {
   System.out.println("Start \"" + prefix + "\" namespace scope. URI: " + uri); 
 }
 public void endPrefixMapping(String prefix) {
   System.out.println("End \"" + prefix + "\" namespace scope."); 
 }
 public void warning(SAXParseException spe) {
   System.out.println("Warning at line "+spe.getLineNumber());
   System.out.println(spe.getMessage());
 }
 public void fatalError(SAXParseException spe) throws SAXException {
   System.out.println("Fatal error at line "+spe.getLineNumber());
   System.out.println(spe.getMessage());
   throw spe;
 }

}


 </source>