java xml aspx_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文件内容

0818b9ca8b590ca3270a3433284dd417.png

xml version="1.0" encoding="UTF-8"

?>

0818b9ca8b590ca3270a3433284dd417.png

DOCTYPE po SYSTEM "src/sample.dtd"

>

0818b9ca8b590ca3270a3433284dd417.png

<

po

id

="po121"

submitted

="2001-10-05"

0818b9ca8b590ca3270a3433284dd417.png    xmlns

="http://www.csdn.net"

>

0818b9ca8b590ca3270a3433284dd417.png

<

billTo

id

="addr-1"

>

0818b9ca8b590ca3270a3433284dd417.png

<

company

>

The Redzero Cop.

company

>

0818b9ca8b590ca3270a3433284dd417.png

<

street

>

Jianguo Road 1ST

street

>

0818b9ca8b590ca3270a3433284dd417.png

<

street

>

Building 1

street

>

0818b9ca8b590ca3270a3433284dd417.png

<

city

>

Haidian

city

>

0818b9ca8b590ca3270a3433284dd417.png

<

state

>

Beijing

state

>

0818b9ca8b590ca3270a3433284dd417.png

<

postalCode

>

100071

postalCode

>

0818b9ca8b590ca3270a3433284dd417.png

billTo

>

0818b9ca8b590ca3270a3433284dd417.png

<

shipTo

href

="addr-1"

/>

0818b9ca8b590ca3270a3433284dd417.png

<

order

>

0818b9ca8b590ca3270a3433284dd417.png

<

item

sku

="o318-BP"

quantity

="5"

>

0818b9ca8b590ca3270a3433284dd417.png

<

description

>

J2EE programmic

description

>

0818b9ca8b590ca3270a3433284dd417.png

item

>

0818b9ca8b590ca3270a3433284dd417.png

<

item

sku

="o947-TI"

quantity

="12"

>

0818b9ca8b590ca3270a3433284dd417.png

<

description

>

Java WEB Service

description

>

0818b9ca8b590ca3270a3433284dd417.png

item

>

0818b9ca8b590ca3270a3433284dd417.png

<

item

sku

="o008-PR"

quantity

="133"

>

0818b9ca8b590ca3270a3433284dd417.png

<

description

>

C++ develop

description

>

0818b9ca8b590ca3270a3433284dd417.png

item

>

0818b9ca8b590ca3270a3433284dd417.png

order

>

0818b9ca8b590ca3270a3433284dd417.png

po

>

0818b9ca8b590ca3270a3433284dd417.png

二、Java对象结构

0818b9ca8b590ca3270a3433284dd417.png

public

class

Order

0818b9ca8b590ca3270a3433284dd417.png

0818b9ca8b590ca3270a3433284dd417.png

...

{

0818b9ca8b590ca3270a3433284dd417.png    List items=newArrayList();

0818b9ca8b590ca3270a3433284dd417.pngpublicvoidaddItem(Item item)

0818b9ca8b590ca3270a3433284dd417.png

0818b9ca8b590ca3270a3433284dd417.png...{

0818b9ca8b590ca3270a3433284dd417.png        items.add(item);

0818b9ca8b590ca3270a3433284dd417.png    }0818b9ca8b590ca3270a3433284dd417.png    @Override

0818b9ca8b590ca3270a3433284dd417.pngpublicString toString()

0818b9ca8b590ca3270a3433284dd417.png

0818b9ca8b590ca3270a3433284dd417.png...{

0818b9ca8b590ca3270a3433284dd417.png        StringBuffer buf=newStringBuffer();

0818b9ca8b590ca3270a3433284dd417.png        buf.append("order");

0818b9ca8b590ca3270a3433284dd417.pngfor(Iterator itr=items.iterator();itr.hasNext();)

0818b9ca8b590ca3270a3433284dd417.png

0818b9ca8b590ca3270a3433284dd417.png...{

0818b9ca8b590ca3270a3433284dd417.png            Item item=(Item)itr.next();

0818b9ca8b590ca3270a3433284dd417.png            buf.append("item");

0818b9ca8b590ca3270a3433284dd417.png            buf.append("sku=").append(item.getSku()).append("").append("quantity=").append(item.getQuantity()).append("")

0818b9ca8b590ca3270a3433284dd417.png            .append("description=").append(item.getDescription()).append("");

0818b9ca8b590ca3270a3433284dd417.png        }0818b9ca8b590ca3270a3433284dd417.pngreturnbuf.toString();

0818b9ca8b590ca3270a3433284dd417.png    }0818b9ca8b590ca3270a3433284dd417.png}

0818b9ca8b590ca3270a3433284dd417.png

0818b9ca8b590ca3270a3433284dd417.png

public

class

Item

0818b9ca8b590ca3270a3433284dd417.png

0818b9ca8b590ca3270a3433284dd417.png

...

{

0818b9ca8b590ca3270a3433284dd417.png    String sku;

0818b9ca8b590ca3270a3433284dd417.pngintquantity;

0818b9ca8b590ca3270a3433284dd417.png    String description;

0818b9ca8b590ca3270a3433284dd417.pngpublicString getDescription()

0818b9ca8b590ca3270a3433284dd417.png

0818b9ca8b590ca3270a3433284dd417.png...{

0818b9ca8b590ca3270a3433284dd417.pngreturndescription;

0818b9ca8b590ca3270a3433284dd417.png    }0818b9ca8b590ca3270a3433284dd417.pngpublicvoidsetDescription(String description)

0818b9ca8b590ca3270a3433284dd417.png

0818b9ca8b590ca3270a3433284dd417.png...{

0818b9ca8b590ca3270a3433284dd417.pngthis.description=description;

0818b9ca8b590ca3270a3433284dd417.png    }0818b9ca8b590ca3270a3433284dd417.pngpublicintgetQuantity()

0818b9ca8b590ca3270a3433284dd417.png

0818b9ca8b590ca3270a3433284dd417.png...{

0818b9ca8b590ca3270a3433284dd417.pngreturnquantity;

0818b9ca8b590ca3270a3433284dd417.png    }0818b9ca8b590ca3270a3433284dd417.pngpublicvoidsetQuantity(intquantity)

0818b9ca8b590ca3270a3433284dd417.png

0818b9ca8b590ca3270a3433284dd417.png...{

0818b9ca8b590ca3270a3433284dd417.pngthis.quantity=quantity;

0818b9ca8b590ca3270a3433284dd417.png    }0818b9ca8b590ca3270a3433284dd417.pngpublicString getSku()

0818b9ca8b590ca3270a3433284dd417.png

0818b9ca8b590ca3270a3433284dd417.png...{

0818b9ca8b590ca3270a3433284dd417.pngreturnsku;

0818b9ca8b590ca3270a3433284dd417.png    }0818b9ca8b590ca3270a3433284dd417.pngpublicvoidsetSku(String sku)

0818b9ca8b590ca3270a3433284dd417.png

0818b9ca8b590ca3270a3433284dd417.png...{

0818b9ca8b590ca3270a3433284dd417.pngthis.sku=sku;

0818b9ca8b590ca3270a3433284dd417.png    }0818b9ca8b590ca3270a3433284dd417.png}

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

解析

0818b9ca8b590ca3270a3433284dd417.png

0818b9ca8b590ca3270a3433284dd417.png

/** */

/**0818b9ca8b590ca3270a3433284dd417.png     * 解析XML文档,把数据绑定到Java对象上

0818b9ca8b590ca3270a3433284dd417.png     *@paramin

0818b9ca8b590ca3270a3433284dd417.png     *@return0818b9ca8b590ca3270a3433284dd417.png*/

0818b9ca8b590ca3270a3433284dd417.png

public

Order parse(InputStream in)

0818b9ca8b590ca3270a3433284dd417.png

0818b9ca8b590ca3270a3433284dd417.png

...

{

0818b9ca8b590ca3270a3433284dd417.png        Stack stack=newStack();

0818b9ca8b590ca3270a3433284dd417.pngtry0818b9ca8b590ca3270a3433284dd417.png

0818b9ca8b590ca3270a3433284dd417.png...{

0818b9ca8b590ca3270a3433284dd417.png//1.得到XMLStreamReader0818b9ca8b590ca3270a3433284dd417.pngXMLInputFactory inputFactory=XMLInputFactory.newInstance();

0818b9ca8b590ca3270a3433284dd417.png            XMLStreamReader reader=inputFactory.createXMLStreamReader(in);

0818b9ca8b590ca3270a3433284dd417.pngwhile(reader.hasNext())

0818b9ca8b590ca3270a3433284dd417.png

0818b9ca8b590ca3270a3433284dd417.png...{

0818b9ca8b590ca3270a3433284dd417.png//2.根据事件类型做相应的处理,对于多数应用来说,处理完成可以直接break,跳出循环,提高性能0818b9ca8b590ca3270a3433284dd417.pngswitch(reader.getEventType())

0818b9ca8b590ca3270a3433284dd417.png

0818b9ca8b590ca3270a3433284dd417.png...{

0818b9ca8b590ca3270a3433284dd417.pngcaseXMLStreamReader.START_ELEMENT:

0818b9ca8b590ca3270a3433284dd417.png                    String name=reader.getLocalName();

0818b9ca8b590ca3270a3433284dd417.pngif("order".equals(name))

0818b9ca8b590ca3270a3433284dd417.png

0818b9ca8b590ca3270a3433284dd417.png...{

0818b9ca8b590ca3270a3433284dd417.png                        Order order=newOrder();

0818b9ca8b590ca3270a3433284dd417.png                        stack.push(order);

0818b9ca8b590ca3270a3433284dd417.png                    }elseif("item".equals(name))

0818b9ca8b590ca3270a3433284dd417.png

0818b9ca8b590ca3270a3433284dd417.png...{

0818b9ca8b590ca3270a3433284dd417.png                        Item item=newItem();

0818b9ca8b590ca3270a3433284dd417.png                        String sku=reader.getAttributeValue(0);

0818b9ca8b590ca3270a3433284dd417.png                        String quantity=reader.getAttributeValue(1);

0818b9ca8b590ca3270a3433284dd417.png                        item.setSku(sku);

0818b9ca8b590ca3270a3433284dd417.png                        item.setQuantity(Integer.parseInt(quantity));

0818b9ca8b590ca3270a3433284dd417.png                        stack.push(item);

0818b9ca8b590ca3270a3433284dd417.png                    }elseif("description".equals(name))

0818b9ca8b590ca3270a3433284dd417.png

0818b9ca8b590ca3270a3433284dd417.png...{

0818b9ca8b590ca3270a3433284dd417.png                        String desc=reader.getElementText();

0818b9ca8b590ca3270a3433284dd417.png                        Item item=(Item) stack.pop();

0818b9ca8b590ca3270a3433284dd417.png                        item.setDescription(desc);

0818b9ca8b590ca3270a3433284dd417.png                        Order order=(Order) stack.peek();

0818b9ca8b590ca3270a3433284dd417.png                        order.addItem(item);

0818b9ca8b590ca3270a3433284dd417.png                    }0818b9ca8b590ca3270a3433284dd417.pngbreak;

0818b9ca8b590ca3270a3433284dd417.png                }0818b9ca8b590ca3270a3433284dd417.png                reader.next();//获取下一个解析事件0818b9ca8b590ca3270a3433284dd417.png}0818b9ca8b590ca3270a3433284dd417.png        }catch(XMLStreamException e)

0818b9ca8b590ca3270a3433284dd417.png

0818b9ca8b590ca3270a3433284dd417.png...{            

0818b9ca8b590ca3270a3433284dd417.png            e.printStackTrace();

0818b9ca8b590ca3270a3433284dd417.png        }0818b9ca8b590ca3270a3433284dd417.pngif(!stack.empty())

0818b9ca8b590ca3270a3433284dd417.png

0818b9ca8b590ca3270a3433284dd417.png...{

0818b9ca8b590ca3270a3433284dd417.pngreturn(Order) stack.pop();

0818b9ca8b590ca3270a3433284dd417.png        }else0818b9ca8b590ca3270a3433284dd417.png

0818b9ca8b590ca3270a3433284dd417.png...{

0818b9ca8b590ca3270a3433284dd417.pngreturnnull;

0818b9ca8b590ca3270a3433284dd417.png        }0818b9ca8b590ca3270a3433284dd417.png    }

0818b9ca8b590ca3270a3433284dd417.png

输出

0818b9ca8b590ca3270a3433284dd417.png

0818b9ca8b590ca3270a3433284dd417.png

/** */

/**0818b9ca8b590ca3270a3433284dd417.png     * 使用StAX接口输出XML文档,无法自动输出格式良好的文档,必须自己控制文档的排版

0818b9ca8b590ca3270a3433284dd417.png     *@paramorder

0818b9ca8b590ca3270a3433284dd417.png     *@return0818b9ca8b590ca3270a3433284dd417.png*/

0818b9ca8b590ca3270a3433284dd417.png

public

String write(Order order)

0818b9ca8b590ca3270a3433284dd417.png

0818b9ca8b590ca3270a3433284dd417.png

...

{

0818b9ca8b590ca3270a3433284dd417.png        StringWriter buffer=newStringWriter();

0818b9ca8b590ca3270a3433284dd417.pngtry0818b9ca8b590ca3270a3433284dd417.png

0818b9ca8b590ca3270a3433284dd417.png...{

0818b9ca8b590ca3270a3433284dd417.png//1.得到XMLStrreamWriter0818b9ca8b590ca3270a3433284dd417.pngXMLOutputFactory outputFactory=XMLOutputFactory.newInstance();

0818b9ca8b590ca3270a3433284dd417.png//修复名称空间前缀。

0818b9ca8b590ca3270a3433284dd417.png//对于任何在范围内不具有名称空间声明的属性,自动名称空间声明。

0818b9ca8b590ca3270a3433284dd417.png//如果元素或属性名称具有前缀,但没有绑定到任何名称空间 URI,则前缀将在序列化时被删除。0818b9ca8b590ca3270a3433284dd417.pngoutputFactory.setProperty("javax.xml.stream.isRepairingNamespaces",newBoolean(true));

0818b9ca8b590ca3270a3433284dd417.png            XMLStreamWriter writer=outputFactory.createXMLStreamWriter(buffer);

0818b9ca8b590ca3270a3433284dd417.png//2.设置默认命名空间0818b9ca8b590ca3270a3433284dd417.pngwriter.setDefaultNamespace("http://www.csdn.net");

0818b9ca8b590ca3270a3433284dd417.png//3.开始输出文档0818b9ca8b590ca3270a3433284dd417.pngwriter.writeStartDocument("UTF-8","1.0");

0818b9ca8b590ca3270a3433284dd417.png            writer.writeCharacters("");//换行,让输出的xml好看一点

0818b9ca8b590ca3270a3433284dd417.png//输出DTD0818b9ca8b590ca3270a3433284dd417.pngwriter.writeDTD("po SYSTEM "src/sample.dtd">");

0818b9ca8b590ca3270a3433284dd417.png            writer.writeCharacters("");

0818b9ca8b590ca3270a3433284dd417.png            

0818b9ca8b590ca3270a3433284dd417.png//输出xml文档的元素,输出一个start,必须要输出一个相应的end0818b9ca8b590ca3270a3433284dd417.pngwriter.writeStartElement("po");//开始根元素po

0818b9ca8b590ca3270a3433284dd417.png//输出元素属性0818b9ca8b590ca3270a3433284dd417.pngwriter.writeAttribute("id","20080124001");

0818b9ca8b590ca3270a3433284dd417.png            writer.writeAttribute("submitted","2008-01-24");

0818b9ca8b590ca3270a3433284dd417.png            writer.writeCharacters("");

0818b9ca8b590ca3270a3433284dd417.png            

0818b9ca8b590ca3270a3433284dd417.png            writer.writeStartElement("billTo");//开始billTo元素0818b9ca8b590ca3270a3433284dd417.pngwriter.writeAttribute("id","addr-1");

0818b9ca8b590ca3270a3433284dd417.png            writer.writeCharacters("");

0818b9ca8b590ca3270a3433284dd417.png            writer.writeStartElement("company");

0818b9ca8b590ca3270a3433284dd417.png            writer.writeCharacters("CSDN");

0818b9ca8b590ca3270a3433284dd417.png            writer.writeEndElement();

0818b9ca8b590ca3270a3433284dd417.png            writer.writeCharacters("");

0818b9ca8b590ca3270a3433284dd417.png            writer.writeStartElement("street");

0818b9ca8b590ca3270a3433284dd417.png            writer.writeCharacters("朝阳区望京北路");

0818b9ca8b590ca3270a3433284dd417.png            writer.writeEndElement();

0818b9ca8b590ca3270a3433284dd417.png            writer.writeCharacters("");

0818b9ca8b590ca3270a3433284dd417.png            writer.writeStartElement("city");

0818b9ca8b590ca3270a3433284dd417.png            writer.writeCharacters("朝阳区");

0818b9ca8b590ca3270a3433284dd417.png            writer.writeEndElement();

0818b9ca8b590ca3270a3433284dd417.png            writer.writeCharacters("");

0818b9ca8b590ca3270a3433284dd417.png            writer.writeStartElement("state");

0818b9ca8b590ca3270a3433284dd417.png            writer.writeCharacters("北京");

0818b9ca8b590ca3270a3433284dd417.png            writer.writeEndElement();

0818b9ca8b590ca3270a3433284dd417.png            writer.writeCharacters("");

0818b9ca8b590ca3270a3433284dd417.png            writer.writeStartElement("postalCode");

0818b9ca8b590ca3270a3433284dd417.png            writer.writeCharacters("100102");

0818b9ca8b590ca3270a3433284dd417.png            writer.writeEndElement();

0818b9ca8b590ca3270a3433284dd417.png            writer.writeCharacters("");

0818b9ca8b590ca3270a3433284dd417.png            writer.writeEndElement();//billTo元素结束0818b9ca8b590ca3270a3433284dd417.png0818b9ca8b590ca3270a3433284dd417.png            writer.writeCharacters("");

0818b9ca8b590ca3270a3433284dd417.png            writer.writeStartElement("shipTo");//开始shipTo元素0818b9ca8b590ca3270a3433284dd417.pngwriter.writeAttribute("href","addr-1");

0818b9ca8b590ca3270a3433284dd417.png            writer.writeEndElement();//shipTo元素结束0818b9ca8b590ca3270a3433284dd417.png0818b9ca8b590ca3270a3433284dd417.png            writer.writeCharacters("");

0818b9ca8b590ca3270a3433284dd417.png            writer.writeStartElement("order");//开始order元素0818b9ca8b590ca3270a3433284dd417.pngwriter.writeCharacters("");

0818b9ca8b590ca3270a3433284dd417.pngfor(Iterator itr=order.items.iterator(); itr.hasNext();)

0818b9ca8b590ca3270a3433284dd417.png

0818b9ca8b590ca3270a3433284dd417.png...{

0818b9ca8b590ca3270a3433284dd417.png                Item item=(Item) itr.next();

0818b9ca8b590ca3270a3433284dd417.png                writer.writeStartElement("item");

0818b9ca8b590ca3270a3433284dd417.png                writer.writeAttribute("sku", item.getSku());

0818b9ca8b590ca3270a3433284dd417.png                writer.writeAttribute("quantity", String.valueOf(item

0818b9ca8b590ca3270a3433284dd417.png                        .getQuantity()));

0818b9ca8b590ca3270a3433284dd417.png                writer.writeCharacters("");

0818b9ca8b590ca3270a3433284dd417.png                writer.writeStartElement("description");

0818b9ca8b590ca3270a3433284dd417.png                writer.writeCharacters(item.getDescription());

0818b9ca8b590ca3270a3433284dd417.png                writer.writeEndElement();

0818b9ca8b590ca3270a3433284dd417.png                writer.writeCharacters("");

0818b9ca8b590ca3270a3433284dd417.png                writer.writeEndElement();

0818b9ca8b590ca3270a3433284dd417.png                writer.writeCharacters("");

0818b9ca8b590ca3270a3433284dd417.png            }0818b9ca8b590ca3270a3433284dd417.png            writer.writeEndElement();//order元素结束0818b9ca8b590ca3270a3433284dd417.png0818b9ca8b590ca3270a3433284dd417.png            writer.writeCharacters("");

0818b9ca8b590ca3270a3433284dd417.png            writer.writeEndElement();//po元素结束0818b9ca8b590ca3270a3433284dd417.pngwriter.writeEndDocument();

0818b9ca8b590ca3270a3433284dd417.png            writer.flush();

0818b9ca8b590ca3270a3433284dd417.png            writer.close();

0818b9ca8b590ca3270a3433284dd417.png        }catch(XMLStreamException e)

0818b9ca8b590ca3270a3433284dd417.png

0818b9ca8b590ca3270a3433284dd417.png...{

0818b9ca8b590ca3270a3433284dd417.png            e.printStackTrace();

0818b9ca8b590ca3270a3433284dd417.png        }0818b9ca8b590ca3270a3433284dd417.pngreturnbuffer.toString();

0818b9ca8b590ca3270a3433284dd417.png    }

代码测试,其中TestStax类为包含了上面解析与输出代码的类

TestStax stax = new TestStax();

Order order = stax.parse(XmlFile.getSample1Stream());

System.out.println(order.toString());

Item item = new Item();

item.setSku("0123-BP");

item.setQuantity(10);

item.setDescription("Java XML 开发");

order.addItem(item);

String xml = stax.write(order);

System.out.println("------------------------------");

System.out.println(xml);

XML输出结果

CSDN

朝阳区望京北路

朝阳区

北京

100102

J2EE programmic

Java WEB Service

C++ develop

Java XML 开发

没有什么多于的介绍,基本上就是一个代码示范,我相信二八法则,20%的知识基本能够满足80%可能碰到的场景,呵呵,算是谬论吧。

详细的介绍在IBM网站上有一篇,个人觉得还不错

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值