Я знаю, что могу проверять xml файл при использовании sax. Но могу ли я проверить, когда я использую Stax?
Проверка stax xml
Ответ 1
В SAX и DOM возможны два способа проверки XML:
- проверить только - через Validator.validate()
- проверить во время разбора - через 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");
}
}
Ответ 2
Вы можете анализировать и проверять с помощью 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(), и вы обрабатываете события разбора, как обычно.
Ответ 3
Нет стандартного способа сделать это. Однако существует расширение API под названием StAX2, которое поддерживает проверку с использованием Sun MSV (проверка нескольких схем). Я бы рекомендовал использовать реализацию Woodstox StAX2.