`
softstone
  • 浏览: 476495 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

Java XML解析之 StAX

阅读更多

StAX:Streaming API for XML ,如同字面意思,是基于流的API,相对于传统的DOM和SAX,StAX在性能和易用性上取得了很好的平衡。StAX是基于SAX的,同样将XML作为一组事件来处理,不过与SAX不同的是,StAX是采用拉(Pull)的方式来处理事件, 允许应用程序从事件流中拉出事件,而不是提供从解析器中接收事件的回调程序程序。

StAX 包括两套处理 XML 的 API,分别提供了不同程度的抽象。一种是基于指针的 API, 提供应用程序把 XML 作为一个标记(或事件)流来处理,这是一种低层 API,效率高,抽象程度低。另一种是较为高级的基于迭代器的 API, 提供应用程序把 XML 作为一系列事件对象来处理,每个对象和应用程序交换 XML 结构的一部分,应用程序直接处理这些代表了XML结构一部分的事件对象。

StAX在JDK6中已经内置了,或许就是以后的标准。

下面以一个简单的例子示范基于指针的API的使用。例子说明:从一个xml结构的订单信息中parse出Java对象,修改这个对象,然后输出为一个xml文件。

一、xml文件内容

 

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE po SYSTEM "src/sample.dtd">
<po id="po121" submitted="2001-10-05"
    xmlns
="http://www.csdn.net">
    
<billTo id="addr-1">
        
<company>The Redzero Cop.</company>
        
<street>Jianguo Road 1ST</street>
        
<street>Building 1</street>
        
<city>Haidian</city>
        
<state>Beijing</state>
        
<postalCode>100071</postalCode>
    
</billTo>
    
<shipTo href="addr-1"/>
    
<order>
        
<item sku="o318-BP" quantity="5">
            
<description>J2EE programmic</description>
        
</item>
        
<item sku="o947-TI" quantity="12">
            
<description>Java WEB Service</description>
        
</item>
        
<item sku="o008-PR" quantity="133">
            
<description>C++ develop</description>
        
</item>
    
</order>
</po>

二、Java对象结构 

public class Order
...{
    List items 
= new ArrayList();
    
public void addItem(Item item)
    
...{
        items.add(item);
    }

    @Override
    
public String toString()
    
...{
        StringBuffer buf 
= new StringBuffer();
        buf.append(
"order ");
        
for (Iterator itr = items.iterator();itr.hasNext();)
        
...{
            Item item 
= (Item)itr.next();
            buf.append(
"item ");
            buf.append(
"sku=").append(item.getSku()).append(" ").append("quantity=").append(item.getQuantity()).append(" ")
            .append(
"description=").append(item.getDescription()).append(" ");
        }

        
return buf.toString();
    }
    
}


public class Item
...{
    String sku;
    
int quantity;
    String description;
    
public String getDescription()
    
...{
        
return description;
    }

    
public void setDescription(String description)
    
...{
        
this.description = description;
    }

    
public int getQuantity()
    
...{
        
return quantity;
    }

    
public void setQuantity(int quantity)
    
...{
        
this.quantity = quantity;
    }

    
public String getSku()
    
...{
        
return sku;
    }

    
public void setSku(String sku)
    
...{
        
this.sku = sku;
    }

}

三、解析示例,注意代码注释

解析

 

    /** *//**
     * 解析XML文档,把数据绑定到Java对象上
     * 
@param in
     * 
@return
     
*/

    
public Order parse(InputStream in)
    
...{
        Stack stack 
= new Stack();
        
try
        
...{
            
//1.得到XMLStreamReader
            XMLInputFactory inputFactory = XMLInputFactory.newInstance();
            XMLStreamReader reader 
= inputFactory.createXMLStreamReader(in);
            
while (reader.hasNext())
            
...{
                
//2.根据事件类型做相应的处理,对于多数应用来说,处理完成可以直接break,跳出循环,提高性能
                switch (reader.getEventType())
                
...{
                
case XMLStreamReader.START_ELEMENT:
                    String name 
= reader.getLocalName();
                    
if ("order".equals(name))
                    
...{
                        Order order 
= new Order();
                        stack.push(order);
                    }
 else if ("item".equals(name))
                    
...{
                        Item item 
= new Item();
                        String sku 
= reader.getAttributeValue(0);
                        String quantity 
= reader.getAttributeValue(1);
                        item.setSku(sku);
                        item.setQuantity(Integer.parseInt(quantity));
                        stack.push(item);
                    }
 else if ("description".equals(name))
                    
...{
                        String desc 
= reader.getElementText();
                        Item item 
= (Item) stack.pop();
                        item.setDescription(desc);
                        Order order 
= (Order) stack.peek();
                        order.addItem(item);
                    }

                    
break;
                }

                reader.next();
//获取下一个解析事件
            }

        }
 catch (XMLStreamException e)
        
...{            
            e.printStackTrace();
        }

        
if (!stack.empty())
        
...{
            
return (Order) stack.pop();
        }
 else
        
...{
            
return null;
        }

    }

输出

分享到:
评论

相关推荐

    有用的Java工具—XML解析工具StAx

    本篇文章将聚焦于Java中的一个高效XML解析工具——StAX(Streaming API for XML)。StAX是一种基于事件驱动的解析器,它允许程序员通过逐个处理XML事件(如开始元素、结束元素、文本等)来读取和写入XML文档,这种...

    java XML解析方式实现自动生成word文档

    本篇文章将详细探讨如何利用Java和XML解析来自动化创建Word文档。 首先,我们需要了解XML的结构。XML(Extensible Markup Language)是一种标记语言,它允许我们以结构化的方式存储数据。在生成Word文档时,我们...

    java心电图xml解析.zip

    Java XML解析是Java开发中的一项重要技能,尤其是在处理结构化数据时。XML(eXtensible Markup Language)是一种用于标记数据的语言,广泛应用于配置文件、数据交换和文档存储等领域。本压缩包“java心电图xml解析....

    java xml 解析包

    Java XML解析包主要指的是用于处理XML(eXtensible Markup Language)文档的库,它使得在Java程序中读取、写入、修改和操作XML变得简单。本篇将详细介绍使用Java进行XML解析的关键知识点,以dom4j-1.6.1为例。 1. *...

    stax+jaxb进行xml解析

    首先,使用StAX逐个读取XML事件,然后利用JAXB将这些事件转换为Java对象,从而实现高效且内存友好的XML解析。 下面是一些关键知识点: 1. **StAX解析流程**: - 创建XMLInputFactory实例,这是解析XML的起点。 -...

    java 解析xml 多级

    同时,考虑到性能和资源消耗,对于非常大的XML文件,可能需要考虑使用SAX解析或者StAX(Streaming API for XML)。 总结来说,Java提供了多种解析XML的方法,包括DOM、SAX和JAXB等。对于处理多级嵌套的XML,DOM和...

    java 解析XML性能对比分析Demo

    本文将深入探讨几种不同的XML解析方法,并通过实际的“Java解析XML性能对比分析Demo”来展示它们的性能差异。我们将讨论DOM、SAX、JDOM、DOM4J和JAXB这五种解析器,以及它们各自的特点和适用场景。 1. DOM(文档...

    java大作业xml解析

    在实现Java XML解析时,通常会用到如Java的JAXB(Java Architecture for XML Binding)库用于对象与XML之间的映射,或者使用DOM、SAX、StAX的API,如javax.xml.parsers.DocumentBuilderFactory、org.xml.sax.helpers...

    JAVA XML解析demo可直接使用

    Java XML解析是编程中常见的一项任务,特别是在处理配置文件、数据交换或集成不同系统时。本教程将聚焦于使用DOM4J库进行XML解析的详细步骤。DOM4J是一个非常灵活且功能强大的Java库,它提供了对XML文档的全面处理,...

    Java6.0新特性之StAX--全面解析Java XML分析技术

    与DOM(Document Object Model)和SAX(Simple API for XML)相比,StAX提供了一种更灵活且控制力更强的XML解析方式。DOM一次性加载整个XML文档,占用内存大,而SAX解析器则是基于事件的,但编程模型相对复杂。StAX...

    JavaXml.zip_java xml_javaXML_java解析xml_文档解析

    在实际开发中,选择哪种XML解析方法取决于具体需求。DOM适合对整个文档进行随机访问,SAX适用于处理大文件,而StAX则提供了更灵活的流式处理。了解并熟练掌握这些解析技术,能够帮助开发者在不同场景下高效地处理XML...

    kettle 解析xml xml文档,配合kettle 解析xml stax方法,完整解析案例使用

    与上一个版本一起使用可以可以起到提高效率的目的。本人解析xml的真实文档

    java在线解析xml

    Java在线解析XML是一种常见的编程任务,特别是在处理Web服务、数据交换或者从XML文件中提取信息时。XML(Extensible Markup Language)是一种结构化数据格式,它允许数据以自定义的标签进行组织,使得数据的传输和...

    Java 解析 xml 3种方法

    Java XML解析是开发中常见的任务,它涉及到将XML文档转换为程序可以操作的数据结构。XML(eXtensible Markup Language)是一种标记语言,常用于数据交换、配置存储等场景。在Java中,有多种方式来解析XML,主要包括...

    java xml 4 种 解析xml 方法 sax jdom dom stAX

    为了处理XML文档,Java提供了多种解析方法,包括SAX(Simple API for XML)、JDOM(Java Document Object Model)、DOM(Document Object Model)以及stAX(Streaming API for XML)。下面将详细介绍这四种解析XML的...

    JAVA XML 解析

    本教程将深入探讨Java中的XML解析技术。 1. DOM解析: DOM(Document Object Model)是一种将XML文档转换为内存树结构的解析方法。Java中的`javax.xml.parsers.DocumentBuilderFactory`和`org.w3c.dom.Document`...

    Java中四种XML解析技术详解

    在实际开发中,根据项目需求和性能考虑,可以选择合适的XML解析技术。例如,如果需要快速查找或修改XML数据,DOM可能是好选择;如果内存有限,SAX或StAX更为合适;如果涉及大量Java对象和XML之间的转换,JAXB则是...

    java通用解析XML工具类

    总结来说,Java提供的XML解析工具有DOM、SAX和StAX,各有优缺点。DOM适合小规模、需要随机访问的场景;SAX适合处理大规模文件,节省内存;而StAX则在性能和灵活性之间取得平衡。根据实际需求选择合适的解析方式,...

    java使用stax技术操作XML文档.doc

    另一方面,基于迭代器的API使用XMLEventReader,它将XML解析为一系列的事件对象,每个对象封装了特定的XML结构信息。XMLEventReader实现了Java的迭代器接口,使得处理XML事件变得更加直观和模块化。与基于指针的API...

Global site tag (gtag.js) - Google Analytics