- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
所以过去两周我一直在研究我的这个项目,但我没有取得任何进展。我的问题不是首先解析 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/
我知道使用sax时可以验证xml文件。但是我可以在使用Stax时进行验证吗? 最佳答案 SAX和DOM有两种XML验证方式: 单独验证-通过Validator.validate() 在解析期间验证-通
我在类路径中有一个 woodstox 和 java SE 1.6 stax 解析器,但默认情况下似乎选择了 woodstox。 但是在某些情况下,我想使用默认的 Java stax 解析器。有没有办法
我正面临 Woodstox STAX 和 java 1.6 STAX 实现之间奇怪的运行时冲突。由于我使用的是 CXF,它会将 Woodstox jar 作为其依赖项的一部分。这是我正在使用的示例代码
我正在尝试将一些代码从使用 DOM(通过 jDOM)转换为使用 StAX。同时,我正在从基于 DTD 的验证迁移到基于 XSD 的验证。哦,为了更好的衡量,我将 JAXB 引入等式 :) 无论如何,作
我不知道如何提取 XML 文件中的开始标记元素名称。我很接近〜意味着没有错误,我正在获取标签名称,但我正在获取标签名称加上信息。我得到的是: {http://www.publishing.org}au
对于下面发布的 xml 文件,我正在使用 StAX 来处理它。我写了下面的代码,但我不知道为什么尽管 xml 文件中有属性,但没有打印有关属性的信息。我希望控制台显示有关“id”、“lat”和“lon
我正在使用 StAX 来处理巨大的 xml 文件。如下面的代码所示,在 switch-case 中有一个默认条件。当我运行代码时默认情况下的文本打印以下内容: unhandled case4 case
我正在尝试使用 stax 从下面的 xml 中获取父项,请注意,同一结构中可以有多个父项和子项。 PARENT-CODE-1 PARENT-NAME-1
我有一个 xml <RPTSVC role:instanceID="765002" role:roleName="Re
是否有可能/是否有一种简单的方法可以找到与 START_ELEMENT 相对应的结束标记 (END_ELEMENT),如下所示? while(reader.hasNext()){ XM
我有以下(测试)XML 文件和使用 StaX 的 Java 代码。我想将此代码应用于大约 30 GB 大但元素相当小的文件,所以我认为 StaX 是一个不错的选择。我收到以下错误: 线程“main”中
我正在使用 java stax XMLStreamReader 来读取 xml。我想抓取某些内部节点的整个字符串。 XML: 我只想能够
我一直在尝试使用 StAX 创建一个 XML Controller 类。我的问题是我没有得到一个元素的完整字符串,而是得到了字符串的一小部分。 (请注意,出于安全原因,某些内容已被隐藏,这些内容将显示
我使用的是 java 6,rt.jar 具有进行基于 STaX 的解析所需的所有类。我主要使用以下类: import javax.xml.stream.XMLEventReader; import j
我正在使用 STAX 事件 API 读取从 SOAP 调用接收到的二进制数据,并希望将其流式传输给使用者。 SOAP 调用的 XML 有效负载如下所示: ......... PHNvY
我在来自 http://stax.codehaus.org/ 的 vrsion 1.2.0 中使用 StAX Streaming Api .当我尝试将以下 xml 写入文件时,不会转义大于 char
我正在使用以下简单的 StAX 代码循环访问 XML 中的所有标记。尺寸input.xml > 100 MB XMLInputFactory xif = XMLInputFactory.newInst
我正在读取与下面相同的 XML 文件: 我希望下面的代码打印出三个 e在屏幕上: XMLInputFactory factory = XMLInputFact
我有以下代码: XMLInputFactory inputFactory = XMLInputFactory.newInstance(); XMLStreamReader xmlStreamReade
我知道如何利用 java stax iterator api 来读取 xml 文档,但我想了解 XMLEvent 和 XMLEventReader 的实现。 XMLInputFactory xmlIn
我是一名优秀的程序员,十分优秀!