我正在尝试使用具有近180k行的Stax Parser读取XML文件。核心逻辑在数据结构中寻找某些标签,属性和存储。对于这种类型的大文件,Stax解析器需要大量时间。它需要将近15分钟的时间,没有任何核心逻辑,只是在循环中迭代。
while (eventReader.hasNext()) { }
我在同一文件上尝试了SAX解析器,以读取标签。它非常快,在几秒钟内完成。
Stax解析器会有什么问题。请建议任何适合大型文件的XML解析器,并在内存和空间利用率方面表现良好。?
调用 hasNext()
始终返回true,除非您达到输入的末尾,并且您的代码不会在输入中更改位置,因为它永远不会读取任何数据。您需要在循环中调用next()
,然后最终hasNext()
将返回false。
顺便说一句,按照现代标准,180k线并不是一个大文件。
坚持使用Stax解析器,因为SAX和Stax都遵循用于解析XML的流式编程模型,我在sax和stax上均使用了示例代码,这是结果
SAX解析器:总时间:10.73毫秒最大内存:1842688分配的内存:125952免费内存:107293
Stax解析器:总时间:7.5毫秒最大内存:1842688分配的内存:125952免费内存:120611
stax是拉动API,而SAX是推动API表示,如果stax解析器,当客户端应用程序需要与XML Infoset进行交互时,client application call applser call call a api api api是一种puth api。XML数据明确要求它。但是,如果SAX解析器,XML解析器将(PUSTES(XML数据发送给客户端,因为解析器遇到XML Infoset中的元素,也就是Parser,是否发送数据。或者当时客户准备使用它。Stax API可以阅读并编写XML文档。使用SAX API,只能读取XML文件。
Stax代码:
public static void main(String[] args) throws FileNotFoundException, XMLStreamException {
XMLInputFactory xf=XMLInputFactory.newInstance();
XMLStreamReader xsr=xf.createXMLStreamReader(new InputStreamReader(new FileInputStream("C:\Users\RNayyar\Desktop\Context\processedFiles\post.xml")));
String startElement = null;
String endElement =null;
String elementTxt = null;
SimpleDateFormat dateFormat = new SimpleDateFormat("MM-dd-yyyy HH:mm:ss");
while (xsr.hasNext()) {
int e = xsr.next();
if(e==XMLStreamConstants.START_ELEMENT){
//System.out.println("StartElement Name :" + xsr.getLocalName());
startElement = xsr.getLocalName();
}
if(e==XMLStreamConstants.END_ELEMENT){
//System.out.println("EndElement Name :" + xsr.getLocalName());
endElement = xsr.getLocalName();
if(startElement.equalsIgnoreCase(endElement))
System.out.println(" ElementName : "+ startElement + " ElementText : " + elementTxt);
}
if(e==XMLStreamConstants.CHARACTERS){
//System.out.println("Element TextValue :" + xsr.getText());
elementTxt = (xsr.getText().contains("n")) ? "" : xsr.getText();
}
}
}