stax xml 验证

Posted

技术标签:

【中文标题】stax xml 验证【英文标题】:stax xml validation 【发布时间】:2011-08-13 04:19:12 【问题描述】:

我知道我可以在使用 sax 时验证 xml 文件。但是我可以在使用 Stax 时进行验证吗?

【问题讨论】:

【参考方案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() 并且您照常处理解析事件。

【讨论】:

我注意到你不能使用像 XMLStreamReaderImpl.getElementText() 这样的东西,为了方便你委托的 next() 方法,因为它移动了当前位置,这会混淆验证器。但这可以解决 - 我喜欢它。 拥有 1 pass 流解析器和验证器有意义吗?只要验证尚未完成,您就不能对数据做任何事情,只能将其缓冲在内存中。验证完成后,您已将所有数据读入内存,并且您的流阅读器已变异为 DOM 阅读器。【参考方案3】:

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

http://woodstox.codehaus.org/

【讨论】:

以上是关于stax xml 验证的主要内容,如果未能解决你的问题,请参考以下文章

高级特性- XML

基于Woodstox的StAX 2 (Streaming API for XML)解析XML

XML编程总结——使用StAX接口操作xml

xml解析之stax

使用 StAX 对 XML 文档进行小修改

使用 StAx 解析 XML 文件时出错