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;
        }

    }

输出

你可能感兴趣的:(XML,Java,数据结构,Web,.net)