gpt4 book ai didi

java - 使用 sax、stax 或 DOM 将 XML 转换为 java 中的数据结构

转载 作者:数据小太阳 更新时间:2023-10-29 02:06:17 27 4
gpt4 key购买 nike

所以过去两周我一直在研究我的这个项目,但我没有取得任何进展。我的问题不是首先解析 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 的了解是有限的(即用外行术语解释事情会很棒)。

最佳答案

查找 JAXB。这是一个将 XML 转换为 Java 代码的框架,反之亦然。如果您使用 JXB 为您自动生成 Java 类,则无需担心手动滚动您自己的数据结构。

您需要从 XML 模式开始,它定义了您的 XML 文件允许的样子。如果您还没有,可以使用 XMLSpy 等工具从 XML 文件创建 XML 架构定义 (XSD) 文件。 JAXB 提供了一个名为 xjc 的工具。这可用于从 XML 模式自动生成 Java 类。在您的 XML 具有重复标记的地方,这些 java 类包含可以迭代的集合。

关于java - 使用 sax、stax 或 DOM 将 XML 转换为 java 中的数据结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26960290/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com