我需要从一个巨大的(大约 500mb)文件中提取 XML,但我有一个 32 位 JVM,它总是用完堆空间。
我已经编写了一个程序来从这个文件中提取 XML,但是必须读取整个文件(我不能每次迭代使用 100 行左右,因为我不能确保第 100 行是结束XML)。
那么我该怎么做呢?
我的提取程序:
private static ArrayList<String> extractXml(String xml) {
String[] newXml = xml.split("\\<\\?");
ArrayList<String> xmlList = new ArrayList<String>(Arrays.asList(newXml));
for(int i = 0; i<xmlList.size();i++){
if(!xmlList.get(i).contains("xml version=\"1.0\" encoding=\"UTF-8\"")){
xmlList.remove(i);
}
}
int size = xmlList.size();
if(xml.contains("#"))
for(int j = 0;j<size;j++){
xmlList.set(j, "<?"+xmlList.get(j));
xmlList.set(j,xmlList.get(j).split("\\#")[0]);
}else
for(int j = 0;j<size;j++){
xmlList.set(j, "<?"+xmlList.get(j).trim());
System.out.println(xmlList.get(j));
}
return xmlList;
}
XML 也有一个 Header(它是一个 JMSStream 标头。就像 XML 上的一个包装器),我已经使用上述逻辑成功地删除了它。
示例文件内容:
#---------- #2 : ID:QADC1_HGR1-EMS13112.15DB4FBEA3665328B:4985 ----------#
<MSG_INFO>
<message type="TextMessage" messageSelector="" receiveTime="2012-09-12T14:37:26.717" jmsServerTimestamp="2012-09-12T14:37:26.775">
<header JMSMessageID="ID:QADC1_HGR1-EMS13112.15DB4FBEA3665328B:4985" JMSDestination="OPS.FPES.OUTBOUND.FLIGHT.TRACK_A.DISTRIBUTION" JMSDestinationType="Topic" JMSDeliveryMode="2" JMSPriority="4" JMSTimestamp="1347478646775"/>
<properties>
...
</properties>
</message>
</MSG_INFO>
BodyLength=31108
<?xml version="1.0" encoding="UTF-8"?>
<ns0:Envelope xmlns:ns0="http://www.wnco.com/opsplatform/flight/flightevent">
<ns0:Header>
<ns1:EventHeader xmlns:ns1="http://www.wnco.com/opsplatform/event/header">
...
</ns1:EventHeader>
</ns0:Header>
<ns0:Body>
<ns1:Flight xmlns:ns1="http://www.wnco.com/opsplatform/flight/flight">
<ns2:ScheduledFlightLeg xmlns:ns2="http://www.wnco.com/opsplatform/flight/flight/scheduledflightleg">
...
<ns3:OperationalFlightLeg xmlns:ns3="http://www.wnco.com/opsplatform/flight/flight/operationalflightleg">
...
</ns3:OperationalFlightLeg>
</ns2:ScheduledFlightLeg>
<ns2:ScheduledFlightLeg xmlns:ns2="http://www.wnco.com/opsplatform/flight/flight/scheduledflightleg">
...
...
</ns3:OperationalFlightLeg>
</ns2:ScheduledFlightLeg>
<ns2:ScheduledFlightLeg xmlns:ns2="http://www.wnco.com/opsplatform/flight/flight/scheduledflightleg">
...
...
</ns3:OperationalFlightLeg>
</ns2:ScheduledFlightLeg>
<ns2:ScheduledFlightLeg xmlns:ns2="http://www.wnco.com/opsplatform/flight/flight/scheduledflightleg">
...
...
</ns3:OperationalFlightLeg>
</ns2:ScheduledFlightLeg>
</ns1:Flight>
</ns0:Body>
</ns0:Envelope>
#---------- #3 : ID:QADC1_HGR1-EMS13112.15DB4FBEA3665328B:4985 ----------#
<MSG_INFO>
<message type="TextMessage" messageSelector="" receiveTime="2012-09-12T14:37:26.717" jmsServerTimestamp="2012-09-12T14:37:26.775">
<header JMSMessageID="ID:QADC1_HGR1-EMS13112.15DB4FBEA3665328B:4985" JMSDestination="OPS.FPES.OUTBOUND.FLIGHT.TRACK_A.DISTRIBUTION" JMSDestinationType="Topic" JMSDeliveryMode="2" JMSPriority="4" JMSTimestamp="1347478646775"/>
<properties>
...
</properties>
</message>
</MSG_INFO>
BodyLength=31108
<?xml version="1.0" encoding="UTF-8"?>
<ns0:Envelope xmlns:ns0="http://www.wnco.com/opsplatform/flight/flightevent">
<ns0:Header>
<ns1:EventHeader xmlns:ns1="http://www.wnco.com/opsplatform/event/header">
...
</ns1:EventHeader>
</ns0:Header>
<ns0:Body>
<ns1:Flight xmlns:ns1="http://www.wnco.com/opsplatform/flight/flight">
<ns2:ScheduledFlightLeg xmlns:ns2="http://www.wnco.com/opsplatform/flight/flight/scheduledflightleg">
...
<ns3:OperationalFlightLeg xmlns:ns3="http://www.wnco.com/opsplatform/flight/flight/operationalflightleg">
...
</ns3:OperationalFlightLeg>
</ns2:ScheduledFlightLeg>
<ns2:ScheduledFlightLeg xmlns:ns2="http://www.wnco.com/opsplatform/flight/flight/scheduledflightleg">
...
...
</ns3:OperationalFlightLeg>
</ns2:ScheduledFlightLeg>
<ns2:ScheduledFlightLeg xmlns:ns2="http://www.wnco.com/opsplatform/flight/flight/scheduledflightleg">
...
...
</ns3:OperationalFlightLeg>
</ns2:ScheduledFlightLeg>
<ns2:ScheduledFlightLeg xmlns:ns2="http://www.wnco.com/opsplatform/flight/flight/scheduledflightleg">
...
...
</ns3:OperationalFlightLeg>
</ns2:ScheduledFlightLeg>
</ns1:Flight>
</ns0:Body>
</ns0:Envelope>