`
softstone
  • 浏览: 462001 次
  • 性别: 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 Stax 解析xml

    java Stax 解析xml

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

    NULL 博文链接:https://lizewu.iteye.com/blog/801123

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

    java 解析xml 方法 sax jdom dom stAX

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

    NULL 博文链接:https://zangweiren.iteye.com/blog/647334

    stax2-api:Stax扩展API,Java拉解析API(针对Xml的Streaming Api)

    概述 Stax2 API是标准 API(... Stax2 API还包含许多API类的局部参考实现,下org.codehaus.stax2.ri :目的是要使它尽可能无痛的Java Stax的解析器,以实现全Stax2支持。 用法 Maven依赖项定义为: &lt;dependency&gt;

    jaxb+stax+demo

    解析xml java与xml转换的demo --stax jaxb

    Java下3中XML解析 DOM方式、SAX方式和StAX方式

    目前我知道的JAVA解析XML的方式有:DOM, SAX, StAX;如果选用这几种,感觉还是有点麻烦;如果使用:JAXB(Java Architecture for XML Binding),个人觉得太方便了

    XML解析Demo

    本示例采用了DOM、SAX、StAX三种方式解析XML,注释相对比较详细。通过Java代码实现的一个解析。

    Java下XML的解析

    目前我知道的JAVA解析XML的方式有:DOM,SAX,StAX;如果选用这几种,感觉还是有点麻烦;如果使用:JAXB(Java ArchitectureforXMLBinding),个人觉得太方便了!:个人理解类似.net的XmlDocument,解析的时候效率不高,...

    fluentxml4j:Java中用于XML解析,序列化,XPath查询和转换的fluent API

    XML解析,序列化XPath查询和转换,无需样板代码 产品特点 简单,流畅的API,但完全灵活 从java.io输入解析到org.w3c.dom.Document 将org.w3c.dom.Document序列化为任何java.io输出 通过XSLT和自定义过滤器支持将...

    Java中对XML的解析详解

    目前我知道的JAVA解析XML的方式有:DOM, SAX, StAX;如果选用这几种,感觉还是有点麻烦;如果使用:JAXB(Java Architecture for XML Binding),个人觉得太方便了

    JAVA_API1.6文档(中文)

    javax.xml.transform.stax 提供特定于 StAX 的转换 API。 javax.xml.transform.stream 此包实现特定于流和 URI 的转换 API。 javax.xml.validation 此包提供了用于 XML 文档验证的 API。 javax.xml.ws 此包包含...

    Java 1.6 API 中文 New

    javax.xml.transform.stax 提供特定于 StAX 的转换 API。 javax.xml.transform.stream 此包实现特定于流和 URI 的转换 API。 javax.xml.validation 此包提供了用于 XML 文档验证的 API。 javax.xml.ws 此包包含核心 ...

    JavaAPI1.6中文chm文档 part1

    javax.xml.transform.stax 提供特定于 StAX 的转换 API。 javax.xml.transform.stream 此包实现特定于流和 URI 的转换 API。 javax.xml.validation 此包提供了用于 XML 文档验证的 API。 javax.xml.ws 此包包含...

    java api最新7.0

    javax.xml.transform.stax 提供特定于 StAX 的转换 API。 javax.xml.transform.stream 此包实现特定于流和 URI 的转换 API。 javax.xml.validation 此包提供了用于 XML 文档验证的 API。 javax.xml.ws 此包包含核心 ...

    wbxml-stream:WBXML格式的Java StAX实现。-开源

    StAX-XML的流API是JavaSE内部用于解析XML文档的标准API。 WBXML-WAP二进制XML是XML的二进制表示形式,主要用于以更紧凑的方式传输XML。 换句话说,wbxml-stream库允许Java使用StAX解析和编码WBXML文档。

    javaStudy-task3:任务3-XML解析器。 使用驱动程序类Main.java。 在output.txt文件中工作的结果

    创建一个Java应用程序以解析XML文档,并使用XML文件中的信息初始化对象的集合。 使用SAX,DOM和StAX解析器进行解析。 使用比较器界面对对象进行排序。 使用XSD验证XML文档。 定义将已开发的XML文档转换为每个作业...

    JavaAPI中文chm文档 part2

    javax.xml.transform.stax 提供特定于 StAX 的转换 API。 javax.xml.transform.stream 此包实现特定于流和 URI 的转换 API。 javax.xml.validation 此包提供了用于 XML 文档验证的 API。 javax.xml.ws 此包包含...

    [Java参考文档]

    javax.xml.transform.stax 提供特定于 StAX 的转换 API。 javax.xml.transform.stream 此包实现特定于流和 URI 的转换 API。 javax.xml.validation 此包提供了用于 XML 文档验证的 API。 javax.xml.ws 此包包含...

Global site tag (gtag.js) - Google Analytics