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.youkuaiyun.com">
<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;
}
}
输出


1003

被折叠的 条评论
为什么被折叠?



