2011-04-26 79 views
13

我知道我可以在使用sax時驗證xml文件。但是,當我使用Stax時,我可以驗證嗎?stax xml驗證

回答

0

沒有標準的方法來做到這一點。但是,有一個名爲StAX2的API擴展,它支持使用Sun的MSV(多模式驗證)進行驗證。我會推薦使用Woodstox StAX2實現。

http://woodstox.codehaus.org/

18

有XML驗證兩種方法可能與SAX和DOM:單獨

  1. 驗證 - 解析期間通過Validator.validate()
  2. 驗證 - 通過DocumentBuilderFactory.setSchema()SAXParserFactory.s etSchema()

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

    } 
} 
17

您可以分析並一次通過使用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)); 

驗證讀取的test.xml調用reader.next(),你處理解析事件如常。

+0

任何幫助(JBoss VS StAX問題)? http://stackoverflow.com/q/20493359/1213738 – 2013-12-10 11:56:54

+1

我會注意到,你不能使用像XMLStreamReaderImpl.getElementText(),爲了方便在你的委託next()方法,因爲它將前面的位置移動,這將混淆驗證器。但這可以解決 - 我喜歡它。 – nsandersen 2016-04-22 14:14:03