使用dom4j進行校驗時是將整個文件讀入內存,處理大文件內存溢出。
使用xsd schema,通過stax讀取xml大文件解決問題。
import java.io.*;
import javax.xml.transform.Source;
import javax.xml.transform.stream.StreamSource;
import javax.xml.validation.*;
import javax.xml.XMLConstants;
import org.xml.sax.SAXParseException;
public class XMLValidator {
public static void validate(String sourceFilePath, String schemaFilePath) throws Exception {
// 1. Lookup a factory for the W3C XML Schema language
SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
// 2. Compile the schema.
// Here the schema is loaded from a java.io.File, but you could use
// a java.net.URL or a javax.xml.transform.Source instead.
File schemaLocation = new File(schemaFilePath);
Schema schema = factory.newSchema(schemaLocation);
// 3. Get a validator from the schema.
Validator validator = schema.newValidator();
// 使用javax.stream 讀取源文件
Source source = new StreamSource(sourceFilePath);
try {
validator.validate(source);
} catch (SAXParseException ex) {
System.out.println(ex.getMessage());
//可獲取文件、行號、具體原因
}
}
}
內部實現採用apache xerces
com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaValidator fSchemaValidator;
http://www.ibm.com/developerworks/xml/library/x-javaxmlvalidapi.html
之前遇到問題:
在處理鏡像大文件時需要按規則分解生成小文件並進行校驗,channel+stax有效提高了讀取300M以上XML文件並寫入的效率。開始在使用dom4j寫xml時效率難以忍受,主要原因是在按節點寫入時的校驗過程影響效率。後來通過file channel+stax方式讀取xml,寫入文件(不做格式校驗,當做txt文件來寫)效率非常高,可以滿足需求。