Stax XML проверки - PullRequest
       20

Stax XML проверки

18 голосов
/ 26 апреля 2011

Я знаю, что могу проверить xml-файл, когда использую sax. Но могу ли я проверить, когда я использую Stax?

Ответы [ 3 ]

22 голосов
/ 17 мая 2011

Существует два способа проверки XML с SAX и DOM:

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

    }
}
20 голосов
/ 17 ноября 2012

Вы можете анализировать и проверять с помощью 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));

Validator считывает test.xml, вызывая reader.next (), и вы обрабатываете события синтаксического анализа как обычно.

0 голосов
/ 26 апреля 2011

Нет стандартного способа сделать это.Однако есть расширение API под названием StAX2, которое поддерживает проверку с использованием MSV от Sun (проверка нескольких схем).Я бы рекомендовал использовать реализацию Woodstox StAX2.

http://woodstox.codehaus.org/

...