stax xml validation

前端 未结 3 1457
余生分开走
余生分开走 2020-12-04 20:18

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

相关标签:
3条回答
  • 2020-12-04 20:39

    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.

    0 讨论(0)
  • 2020-12-04 20:45

    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");
    
        }
    }
    
    0 讨论(0)
  • 2020-12-04 21:00

    There is no standard way to do this. However, there's an API extension called StAX2 which support validation using Sun's MSV (multi schema validation). I would recommend to use the Woodstox StAX2 implementation.

    http://woodstox.codehaus.org/

    0 讨论(0)
提交回复
热议问题