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

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

【问题讨论】:

    标签: stax xsd-validation


    【解决方案1】:

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

    【讨论】:

      【解决方案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/

      【讨论】:

        猜你喜欢
        • 2011-01-29
        • 2015-04-09
        • 1970-01-01
        • 2013-01-09
        • 2016-03-27
        • 1970-01-01
        • 1970-01-01
        • 2014-02-02
        • 2023-03-31
        相关资源
        最近更新 更多