Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

stax xml validation

I know I can validate xml-file when I use sax. But can I validate when I use Stax?

like image 697
Tim Avatar asked Apr 26 '11 16:04

Tim


2 Answers

There are two ways of XML validation possible with SAX and DOM:

  1. validate alone - via Validator.validate()
  2. validate during parsing - via DocumentBuilderFactory.setSchema() and SAXParserFactory.setSchema()

With StAX, validation is possible, but only the first way of doing it.

You can try something like this:

import javax.xml.validation.*;
import javax.xml.transform.stax.*;
import javax.xml.stream.*;
import javax.xml.*;
import java.io.*;

public class StaxValidation {

    public static void main (String args[]) throws Exception {

        XMLStreamReader reader = XMLInputFactory.newInstance().createXMLStreamReader(new FileInputStream("test.xml"));

        SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
        Schema schema = factory.newSchema(new File("test.xsd"));

        Validator validator = schema.newValidator();
        validator.validate(new StAXSource(reader));

        //no exception thrown, so valid
        System.out.println("Document is valid");

    }
}
like image 75
mnicky Avatar answered Sep 22 '22 10:09

mnicky


You can parse and validate with StAX in one pass. Use javax.xml.stream.util.StreamReaderDelegate:

 XMLStreamReader reader = XMLInputFactory.newInstance().createXMLStreamReader(new FileInputStream  ("test.xml"));

 reader = new StreamReaderDelegate(reader) {
     public int next() throws XMLStreamException {
          int n = super.next();

          // process event

          return n;
     }};

 SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
 Schema schema = factory.newSchema(new File("test.xsd"));
 Validator validator = schema.newValidator();
 validator.validate(new StAXSource(reader));

Validator reads test.xml calling reader.next() and you process parsing events as usual.

like image 42
Evgeniy Dorofeev Avatar answered Sep 22 '22 10:09

Evgeniy Dorofeev