У меня есть XML-файл размером 4.2 ГБ! Очевидно, что разбор всей DOM нецелесообразен. Я смотрел SAX и STAX, чтобы выполнить синтаксический анализ этого гигантского XML-файла. Однако все примеры, которые я видел, просты. Файл XML, с которым я имею дело, вложен в вложенные вложенные. Есть области, где они идут на 10+ уровней.Java Stax for Complex/Large XML
Я нашел этот учебник, но не уверен, что его жизнеспособное решение.
http://www.javacodegeeks.com/2013/05/parsing-xml-using-dom-sax-and-stax-parser-in-java.html (Боттон пример использования Stax)
Я не совсем уверен, как обрабатывать вложенные объекты.
Я создал объекты Java, чтобы имитировать структуру XML. Вот несколько, слишком много для отображения.
Record.java
public class Record implements Serializable {
String uid;
StaticData staticData;
DynamicData dynamicData;
}
Summary.java
public class Summary {
EWUID ewuid;
PubInfo pubInfo;
Titles titles;
Names names;
DocTypes docTypes;
Publishers publishers;
}
EWUID.java
public class EWUID {
String collId;
String edition;
}
PubInfo.java
public class PubInfo {
String coverDate;
String hasAbstract;
String issue;
String pubMonth;
String pubType;
String pubYear;
String sortDate;
String volume;
}
Это код, который я придумал до сих пор.
public class TRWOSParser {
XMLEventReader eventReader;
XMLInputFactory inputFactory;
InputStream inputStream;
public TRWOSParser(String file) throws FileNotFoundException, XMLStreamException {
inputFactory = XMLInputFactory.newInstance();
inputStream = new FileInputStream(file);
eventReader = inputFactory.createXMLEventReader(inputStream);
}
public void parse() throws XMLStreamException{
while (eventReader.hasNext()) {
XMLEvent event = eventReader.nextEvent();
if (event.isStartElement()) {
StartElement startElement = event.asStartElement();
if (startElement.getName().getLocalPart().equals("record")) {
Record record = new Record();
Iterator<Attribute> attributes = startElement.getAttributes();
while (attributes.hasNext()) {
Attribute attribute = attributes.next();
if (attribute.getName().toString().equals("UID")) {
System.out.println("UID: " + attribute.getValue());
}
}
}
}
}
}
}
Update:
Данные в XML лицензируется, поэтому я не могу показать весь файл. Это очень маленький сегмент, в котором я скремблировал данные.
<?xml version="1.0" encoding="UTF-8"?>
<records>
<REC>
<UID>WOS:000310438600004</UID>
<static_data>
<summary>
<EWUID>
<WUID coll_id="WOS" />
<edition value="WOS.SCI" />
</EWUID>
<pub_info coverdate="NOV 2012" has_abstract="N" issue="5" pubmonth="NOV" pubtype="Journal" pubyear="2012" sortdate="2012-11-01" vol="188">
<page begin="1662" end="1663" page_count="2">1662-1663</page>
</pub_info>
<titles count="6">
<title type="source">JOURNAL OF UROLOGY</title>
<title type="source_abbrev">J UROLOGY</title>
<title type="abbrev_iso">J. Urol.</title>
<title type="abbrev_11">J UROL</title>
<title type="abbrev_29">J UROL</title>
<title type="item">Something something</title>
</titles>
<names count="1">
<name addr_no="1 2 3" reprint="Y" role="author" seq_no="1">
<display_name>John Doe</display_name>
<full_name>John Doe</full_name>
<wos_standard>Doe, John</wos_standard>
<first_name>John</first_name>
<last_name>Doe</last_name>
</name>
</names>
<doctypes count="1">
<doctype>Editorial Material</doctype>
</doctypes>
<publishers>
<publisher>
<address_spec addr_no="1">
<full_address>360 PARK AVE SOUTH, NEW YORK, NY 10010-1710 USA</full_address>
<city>NEW YORK</city>
</address_spec>
<names count="1">
<name addr_no="1" role="publisher" seq_no="1">
<display_name>ELSEVIER SCIENCE INC</display_name>
<full_name>ELSEVIER SCIENCE INC</full_name>
</name>
</names>
</publisher>
</publishers>
</summary>
</static_data>
</REC>
</records>
Пара вопросов: есть ли у вас схема для этого файла и существует ли определенный уровень максимального повторения? Он имеет несколько уровней в глубину - это прекрасно, но имеет ли он идентификацию, из которой можно безопасно разобрать все поддерева сразу? – lscoughlin
Я просил XSD, но на данный момент у меня его нет. Я не совсем уверен, насколько глубоко это может произойти, самое большее, что я видел до сих пор, это 11. – greyfox
Ваша проблема заключается не в уровне гнездования, а в скорости повторения. На каком уровне он становится достаточно повторяющимся, чтобы вы могли сразу обрабатывать поддеревья? – lscoughlin