stax解析xml时, 使用栈来处理,不错的代码
来源:互联网 发布:玩游戏学编程app 编辑:程序博客网 时间:2024/05/16 19:23
import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.InputStream;import java.util.Queue;import java.util.Stack;import javax.xml.stream.XMLInputFactory;import javax.xml.stream.XMLStreamException;import javax.xml.stream.XMLStreamReader;public class Parse {public static void main(String[] args) throws FileNotFoundException {String s=Parse.class.getResource("/").getFile()+"data.xml"; Stack stack=new Parse().parse(new FileInputStream(s)); while(!stack.isEmpty()){ System.out.println(""+stack.pop()); }}public Stack parse(InputStream in) { Stack stack = new Stack(); try { //1.得到XMLStreamReader XMLInputFactory inputFactory = XMLInputFactory.newInstance(); XMLStreamReader reader = inputFactory.createXMLStreamReader(in); int i=0; while (reader.hasNext()) { //2.根据事件类型做相应的处理,对于多数应用来说,处理完成可以直接break,跳出循环,提高性能 switch (reader.getEventType()) { case XMLStreamReader.START_ELEMENT: String name = reader.getLocalName(); if ("order".equals(name)) { System.out.println(++i); Order order = new Order(); stack.push(order); } else if ("item".equals(name)) { System.out.println("item"); 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)) { System.out.println("description"); 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 stack; } else { return null; } }}
<?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><order><item sku="o318-BP22" quantity="5"><description>J2EE programmic</description></item><item sku="o947-TI22" quantity="12"><description>Java WEB Service</description></item><item sku="o008-PR22" quantity="133"><description>C++ develop</description></item></order></po>