stax xml验证

Tim*_*Tim 17 stax xsd-validation

我知道当我使用sax时我可以验证xml文件.但是,当我使用Stax时,我可以验证吗?

mni*_*cky 21

SAX和DOM有两种XML验证方式:

  1. 单独验证 - 通过Validator.validate()
  2. 解析期间验证 - 通过DocumentBuilderFactory.setSchema()SAXParserFactory.setSchema()

使用StAX,验证是可能的,但只有第一种方法.

你可以尝试这样的事情:

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");

    }
}
Run Code Online (Sandbox Code Playgroud)


Evg*_*eev 19

您可以一次解析并使用StAX进行验证.使用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));
Run Code Online (Sandbox Code Playgroud)

Validator读取test.xml调用reader.next()并像往常一样处理解析事件.


chr*_*ris 2

没有标准方法可以做到这一点。不过,有一个名为 StAX2 的 API 扩展,它支持使用 Sun 的 MSV(多模式验证)进行验证。我建议使用 Woodstox StAX2 实现。

http://woodstox.codehaus.org/