【发布时间】:2015-01-13 15:11:27
【问题描述】:
所以过去两周我一直在研究我的这个项目,但我没有取得任何进展。我的问题不是一开始就解析 XML 文件,而是之后如何处理它。因此,我使用 SAX、StAX 和 DOM 解析器编写了程序,其中我获取了一个非常大的 XML 文件,然后按顺序打印出元素及其值。但是,我正在处理的 XML 很大,所以使用 DOM 当然是低效的。然而,我遇到的另一个问题是 xml 文件有 40,000 个信息条目,而且它的结构很复杂。这是它的一小段摘录:
<metabolite>
<version>3.5</version>
<creation_date>2005-11-16 08:48:42 -0700</creation_date>
<update_date>2013-02-08 17:07:44 -0700</update_date>
<accession>HMDB00002</accession>
<secondary_accessions>
</secondary_accessions>
<name>1,3-Diaminopropane</name>
<description>1,3-Diaminopropane is a stable, flammable and highly hydroscopic fluid. It is a polyamine that is normally quite toxic if swallowed, inhaled or absorbed through the skin. It is a catabolic byproduct of spermidine. It is also a precursor in the enzymatic synthesis of beta-alanine. 1, 3-Diaminopropane is involved in the arginine/proline metabolic pathways and the beta-alanine metabolic pathway.</description>
<synonyms>
<synonym>1,3-Diamino-N-propane</synonym>
<synonym>1,3-Propanediamine</synonym>
<synonym>1,3-Propylenediamine</synonym>
<synonym>1,3-Trimethylenediamine</synonym>
<synonym>3-Aminopropylamine</synonym>
<synonym>a,w-Propanediamine</synonym>
<synonym>Propane-1,3-diamine</synonym>
<synonym>Trimethylenediamine</synonym>
</synonyms>
<chemical_formula>C3H10N2</chemical_formula>
所以这是 40 个条目之一,其中包含更多元素等。我需要能够用我的程序做的是允许用户从 40,000 个条目中选择他想要的信息,然后以 excel 表的形式返回信息。因此,如果我只想说出所有 40,000 个条目的版本号和名称,它只会将这些值返回到 excel 中。目前,我已经制作了一个使用 StAX 循环并通过打印到控制台返回所有元素和值的程序。我将如何创建数据结构,例如树或其他东西,然后让我可以做我想做的事情(即遍历该数据并仅返回我正在寻找的数据)。
这是迄今为止我在循环我的文档并按顺序返回 40,000 个条目的信息方面所做的工作:
public class xmlRead {
private static XMLStreamReader reader;
public xmlRead(){
try{
InputStream file = new FileInputStream("/Users/Kevlar/Dropbox/PhD/Java/HMDB/testOutput.xml");
XMLInputFactory inputFactory = XMLInputFactory.newInstance();
reader = inputFactory.createXMLStreamReader(file);
assert(reader.getEventType() == XMLEvent.START_DOCUMENT);
} catch (XMLStreamException e){
System.err.println("XMLStreamException : " + e.getMessage());
} catch (FactoryConfigurationError e){
System.err.println("FactoryConfigurationError : " + e.getMessage());
} catch (FileNotFoundException e){
System.err.println("FileNotFoundException : " + e.getMessage());
}
}
public void metaboliteInfo() throws XMLStreamException{
while(reader.hasNext()){
int event = reader.getEventType();
if(event == XMLStreamConstants.START_ELEMENT && reader.getLocalName() == "metabolite"){
System.out.println("New " + reader.getLocalName());
mainElements(reader);
}
else if(event == XMLStreamConstants.END_DOCUMENT){
System.out.println("end of document");
break;
}
else{
reader.next();
}
}
reader.close();
}
public void mainElements(XMLStreamReader reader) throws XMLStreamException{
int level = 1;
do{
int event = reader.next();
if(event == XMLStreamConstants.START_ELEMENT){
System.out.println("Element :" + reader.getLocalName());
level++;
if(level == 2){
subElements(reader);
level--;
}
}
else if(event == XMLStreamConstants.CHARACTERS && !reader.isWhiteSpace()){
System.out.println(reader.getText());
}
else if(event == XMLStreamConstants.END_ELEMENT){
level--;
}
}while(level > 0);
reader.close();
}
private void subElements(XMLStreamReader reader) throws XMLStreamException {
int level = 1;
do{
int event = reader.next();
if(event == XMLStreamConstants.START_ELEMENT){
System.out.println("Sub element :" + reader.getLocalName());
level++;
if(level == 2){
subElements(reader);
level--;
}
}
else if(event == XMLStreamConstants.CHARACTERS && !reader.isWhiteSpace()){
System.out.println(reader.getText());
}
else if(event == XMLStreamConstants.END_ELEMENT){
level--;
}
}while(level > 0);
reader.close();
}
public void findElements(XMLStreamReader reader, String element) throws XMLStreamException{
int level = 1;
do{
int event = reader.next();
if(event == XMLStreamConstants.START_ELEMENT){
if(reader.getLocalName() == element){
System.out.println(reader.getLocalName());
}
level++;
if(level == 2){
subElements(reader);
level--;
}
}
else if(event == XMLStreamConstants.CHARACTERS && !reader.isWhiteSpace()){
System.out.println(reader.getText());
}
else if(event == XMLStreamConstants.END_ELEMENT){
level--;
}
}while(level > 0);
reader.close();
}
public static void main(String[] args) throws XMLStreamException{
xmlRead test = new xmlRead();
test.metaboliteInfo();
}
}
我也应该在这里指出,我实际上并不是程序员。为了我的研究,我只需要处理这些 XML 文件,但没有其他人可以为我做这件事,所以恐怕我对 java 的了解是有限的(即用外行术语解释事情会很棒)。
【问题讨论】:
-
您找到解决方案了吗?
-
我做了,我只是从网上复制了一个 TreeNode 类,它似乎正在工作,我无法得到其他人建议的工作
标签: java xml dom xml-parsing stax