Java Stax解析XML示例

package org.itat.stax;

import java.io.IOException;
import java.io.InputStream;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.stream.EventFilter;
import javax.xml.stream.FactoryConfigurationError;
import javax.xml.stream.XMLEventReader;
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLOutputFactory;
import javax.xml.stream.XMLStreamConstants;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamReader;
import javax.xml.stream.XMLStreamWriter;
import javax.xml.stream.events.XMLEvent;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Result;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.TransformerFactoryConfigurationError;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpressionException;
import javax.xml.xpath.XPathFactory;

import org.junit.Test;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

public class TestStax {

  @Test
  public void test01() {
    XMLInputFactory factory = XMLInputFactory.newInstance();
    InputStream is = null;
    try {
      is = TestStax.class.getClassLoader().getResourceAsStream("books.xml");
      XMLStreamReader reader = factory.createXMLStreamReader(is);
      while(reader.hasNext()) {
        int type = reader.next();
        //判断节点类型是否是开始或者结束或者文本节点,之后根据情况及进行处理
        if(type==XMLStreamConstants.START_ELEMENT) {
          System.out.println(reader.getName());
        } else if(type==XMLStreamConstants.CHARACTERS) {
          System.out.println(reader.getText().trim());
        } else if(type==XMLStreamConstants.END_ELEMENT) {
          System.out.println("/"+reader.getName());
        }
      }
    } catch (XMLStreamException e) {
      e.printStackTrace();
    } finally {
      try {
        if(is!=null) is.close();
      } catch (IOException e) {
        e.printStackTrace();
      }
    }
  }

  @Test
  public void test02() {
    XMLInputFactory factory = XMLInputFactory.newInstance();
    InputStream is = null;
    try {
      is = TestStax.class.getClassLoader().getResourceAsStream("books.xml");
      XMLStreamReader reader = factory.createXMLStreamReader(is);
      while(reader.hasNext()) {
        int type = reader.next();
        if(type==XMLStreamConstants.START_ELEMENT) {
          String name = reader.getName().toString();
          if(name.equals("book")) {
            System.out.println(reader.getAttributeName(0)+":"+reader.getAttributeValue(0));
          }
        }
      }
    } catch (XMLStreamException e) {
      e.printStackTrace();
    } finally {
      try {
        if(is!=null) is.close();
      } catch (IOException e) {
        e.printStackTrace();
      }
    }
  }

  @Test
  public void test03() {
    XMLInputFactory factory = XMLInputFactory.newInstance();
    InputStream is = null;
    try {
      is = TestStax.class.getClassLoader().getResourceAsStream("books.xml");
      XMLStreamReader reader = factory.createXMLStreamReader(is);
      while(reader.hasNext()) {
        int type = reader.next();

        if(type==XMLStreamConstants.START_ELEMENT) {
          String name = reader.getName().toString();
          if(name.equals("title")) {
            System.out.print(reader.getElementText()+":");
          }
          if(name.equals("price")) {
            System.out.print(reader.getElementText()+"\n");
          }
        }
      }
    } catch (XMLStreamException e) {
      e.printStackTrace();
    } finally {
      try {
        if(is!=null) is.close();
      } catch (IOException e) {
        e.printStackTrace();
      }
    }
  }

  @Test
  public void test04() {
    XMLInputFactory factory = XMLInputFactory.newInstance();
    InputStream is = null;
    try {
      is = TestStax.class.getClassLoader().getResourceAsStream("books.xml");
      //基于迭代模型的操作方式
      XMLEventReader reader = factory.createXMLEventReader(is);
      int num = 0;
      while(reader.hasNext()) {
        //通过XMLEvent来获取是否是某种节点类型
        XMLEvent event = reader.nextEvent();
        if(event.isStartElement()) {
          //通过event.asxxx转换节点
          String name = event.asStartElement().getName().toString();
          if(name.equals("title")) {
            System.out.print(reader.getElementText()+":");
          }
          if(name.equals("price")) {
            System.out.print(reader.getElementText()+"\n");
          }
        }
        num++;
      }
      System.out.println(num);
    } catch (XMLStreamException e) {
      e.printStackTrace();
    } finally {
      try {
        if(is!=null) is.close();
      } catch (IOException e) {
        e.printStackTrace();
      }
    }
  }

  @Test
  public void test05() {
    XMLInputFactory factory = XMLInputFactory.newInstance();
    InputStream is = null;
    try {
      is = TestStax.class.getClassLoader().getResourceAsStream("books.xml");
      //基于Filter的过滤方式,可以有效的过滤掉不用进行操作的节点,效率会高一些
      XMLEventReader reader = factory.createFilteredReader(factory.createXMLEventReader(is),
          new EventFilter() {
            @Override
            public boolean accept(XMLEvent event) {
              //返回true表示会显示,返回false表示不显示
              if(event.isStartElement()) {
                String name = event.asStartElement().getName().toString();
                if(name.equals("title")||name.equals("price"))
                  return true;
              }
              return false;
            }
          });
      int num = 0;
      while(reader.hasNext()) {
        //通过XMLEvent来获取是否是某种节点类型
        XMLEvent event = reader.nextEvent();
        if(event.isStartElement()) {
          //通过event.asxxx转换节点
          String name = event.asStartElement().getName().toString();
          if(name.equals("title")) {
            System.out.print(reader.getElementText()+":");
          }
          if(name.equals("price")) {
            System.out.print(reader.getElementText()+"\n");
          }
        }
        num++;
      }
      System.out.println(num);
    } catch (XMLStreamException e) {
      e.printStackTrace();
    } finally {
      try {
        if(is!=null) is.close();
      } catch (IOException e) {
        e.printStackTrace();
      }
    }
  }

  @Test
  public void test06() {
    InputStream is = null;
    try {
      is = TestStax.class.getClassLoader().getResourceAsStream("books.xml");
      //创建文档处理对象
      DocumentBuilder db = DocumentBuilderFactory.newInstance().newDocumentBuilder();
      //通过DocumentBuilder创建doc的文档对象
      Document doc = db.parse(is);
      //创建XPath
      XPath xpath = XPathFactory.newInstance().newXPath();
      //第一个参数就是xpath,第二参数就是文档
      NodeList list = (NodeList)xpath.evaluate("//book[@category='WEB']", doc,XPathConstants.NODESET);
      for(int i=0;i<list.getLength();i++) {
        //遍历输出相应的结果
        Element e = (Element)list.item(i);
        System.out.println(e.getElementsByTagName("title").item(0).getTextContent());
      }
    } catch (ParserConfigurationException e) {
      e.printStackTrace();
    } catch (SAXException e) {
      e.printStackTrace();
    } catch (IOException e) {
      e.printStackTrace();
    } catch (XPathExpressionException e) {
      e.printStackTrace();
    } finally {
      try {
        if(is!=null) is.close();
      } catch (IOException e) {
        e.printStackTrace();
      }
    }
  }

  @Test
  public void test07() {
    try {
      XMLStreamWriter xsw = XMLOutputFactory.newInstance().createXMLStreamWriter(System.out);
      xsw.writeStartDocument("UTF-8","1.0");
      xsw.writeEndDocument();
      String ns = "http://11:dd";
      xsw.writeStartElement("nsadfsadf","person",ns);
      xsw.writeStartElement(ns,"id");
      xsw.writeCharacters("1");
      xsw.writeEndElement();
      xsw.writeEndElement();
      xsw.flush();
      xsw.close();
    } catch (XMLStreamException e) {
      e.printStackTrace();
    } catch (FactoryConfigurationError e) {
      e.printStackTrace();
    }
  }

  @Test
  public void test08() {
    InputStream is = null;
    try {
      is = TestStax.class.getClassLoader().getResourceAsStream("books.xml");
      //创建文档处理对象
      DocumentBuilder db = DocumentBuilderFactory.newInstance().newDocumentBuilder();
      //通过DocumentBuilder创建doc的文档对象
      Document doc = db.parse(is);
      //创建XPath
      XPath xpath = XPathFactory.newInstance().newXPath();
      Transformer tran = TransformerFactory.newInstance().newTransformer();
      tran.setOutputProperty(OutputKeys.ENCODING,"UTF-8");
      tran.setOutputProperty(OutputKeys.INDENT, "yes");
      //第一个参数就是xpath,第二参数就是文档
      NodeList list = (NodeList)xpath.evaluate("//book[title='Learning XML']", doc,XPathConstants.NODESET);
      //获取price节点
      Element be = (Element)list.item(0);
      Element e = (Element)(be.getElementsByTagName("price").item(0));
      e.setTextContent("333.9");
      Result result = new StreamResult(System.out);
      //通过tranformer修改节点
      tran.transform(new DOMSource(doc), result);
    } catch (ParserConfigurationException e) {
      e.printStackTrace();
    } catch (SAXException e) {
      e.printStackTrace();
    } catch (IOException e) {
      e.printStackTrace();
    } catch (XPathExpressionException e) {
      e.printStackTrace();
    } catch (TransformerConfigurationException e) {
      e.printStackTrace();
    } catch (TransformerFactoryConfigurationError e) {
      e.printStackTrace();
    } catch (TransformerException e) {
      e.printStackTrace();
    } finally {
      try {
        if(is!=null) is.close();
      } catch (IOException e) {
        e.printStackTrace();
      }
    }
  }
}
<?xml version="1.0" encoding="UTF-8"?>

<bookstore>

<book category="COOKING">
 <title lang="en">Everyday Italian</title>
 <author>Giada De Laurentiis</author>
 <year>2005</year>
 <price>30.00</price>
</book>

<book category="CHILDREN">
 <title lang="en">Harry Potter</title>
 <author>J K. Rowling</author>
 <year>2005</year>
 <price>29.99</price>
</book>

<book category="WEB">
 <title lang="en">XQuery Kick Start</title>
 <author>James McGovern</author>
 <author>Per Bothner</author>
 <author>Kurt Cagle</author>
 <author>James Linn</author>
 <author>Vaidyanathan Nagarajan</author>
 <year>2003</year>
 <price>49.99</price>
</book>

<book category="WEB">
 <title lang="en">Learning XML</title>
 <author>Erik T. Ray</author>
 <year>2003</year>
 <price>39.95</price>
</book>

</bookstore>

以上就是Java Stax解析XML示例的详细内容,更多关于Java 解析XML的资料请关注我们其它相关文章!

(0)

相关推荐

  • Java web xml文件读取解析方式

    其实解析xml文件有四种方式:DOM,JDOM,DOM4J,SAX. 我们来说与平台无关的两种官方解析方式:DOM 和 SAX 一.DOM 解析 在 Java 代码中,xml 文件是标记型文档,这时用 dom 来解析 xml 文件 dom 会根据 html 的层级结构在内存中分配一个树形结构,把html的标签,属性和文本都封装成对象 DOM 解析步骤: 1.使用 newInstance 方法,创建一个 DocumentBuilderFactory 的对象. 2.创建一个 DocumentBuil

  • Java如何基于DOM解析xml文件

    一.Java解析xml.解析xml四种方法.DOM.SAX.JDOM.DOM4j.XPath 此文针对其中的DOM方法具体展开介绍及代码分析 sax.dom是两种对xml文档进行解析的方法(没有具体实现,只是接口),所以只有它们是无法解析xml文档的:jaxp只是api,它进一步封装了sax.dom两种接口,并且提供了DomcumentBuilderFactory/DomcumentBuilder和SAXParserFactory/SAXParser(默认使用xerces解释器).如果是嵌入式的

  • JAVA中4种解析XML文件的方法

    XML是一种通用的数据交换格式,它的平台无关性.语言无关性.系统无关性.给数据集成与交互带来了极大的方便.XML在不同的语言环境中解析方式都是一样的,只不过实现的语法不同而已. XML的解析方式分为四种: 1.DOM解析: 2.SAX解析: 3.JDOM解析: 4.DOM4J解析. 其中前两种属于基础方法,是官方提供的平台无关的解析方式:后两种属于扩展方法,它们是在基础的方法上扩展出来的,只适用于java平台. 针对以下XML文件,会对四种方式进行详细描述: <?xml version="

  • JAVA DOM解析XML文件过程详解

    这篇文章主要介绍了JAVA DOM解析XML文件过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 代码如下 import java.io.IOException; import javax.xml.parsers.*; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.NamedNodeMap; import org.w3c.dom.No

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

    先简单说下前三种方式: DOM方式:个人理解类似.net的XmlDocument,解析的时候效率不高,占用内存,不适合大XML的解析:SAX方式:基于事件的解析,当解析到xml的某个部分的时候,会触发特定事件,可以在自定义的解析类中定义当事件触发时要做得事情:个人感觉一种很另类的方式,不知道.Net体系下是否有没有类似的方式?StAX方式:个人理解类似.net的XmlReader方式,效率高,占用内存少,适用大XML的解析:不过SAX方式之前也用过,本文主要介绍JAXB,这里只贴下主要代码: 复

  • Java实现解析并生成xml原理实例详解

    XML解析: * 解析xml可以做: * 如果xml作为配置文件:读取 * 如果xml作为传输文件:写,读 xml解析思想: * DOM:将文档加载进内存,形成一颗dom树(document对象),将文档的各个组成部分封装为一些对象. * 优点:因为,在内存中会形成dom树,可以对dom树进行增删改查. * 缺点:dom树非常占内存,解析速度慢. Document Element Text Attribute Comment * SAX:逐行读取,基于事件驱动 * 优点:不占内存,速度快 * 缺

  • java操作xml的方法汇总及解析

    这篇文章主要介绍了java操作xml的方法汇总及解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 一丶常用方法 主要有3个方面, 1读取xml文件, 2使用xpath根据指定路径获取某一节点数据 3, xml和java bean的转换 XmlUtils.java /** * 和cn.hutool.core.util.XmlUtil许多功能重合, 本类可以当做学习的例子 * 可以直接使用cn.hutool.core.util.XmlUtil *

  • Java 解析XML数据的4种方式

    解析的四种方式 DOM 解析 SAX 解析 JDOM 解析 DOM4J 解析 案例实操 DOM 解析 DOM(Document Object Model, 文档对象模型),在应用程序中,基于 DOM 的 XML 分析器将一个 XML 文档转换成一个对象模型的集合(通常称为 DOM 树 ),应用程序正是通过对这个对象模型的操作,来实现对 XML 文档数据的操作.XML 本身是以树状的形式出现的,所以 DOM 操作的时候,也将按章树的形式进行转换.在整个 DOM 树中,最大的地方指的是 Docume

  • Java Stax解析XML示例

    package org.itat.stax; import java.io.IOException; import java.io.InputStream; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import javax.xml.stream.E

  • Java全面解析XML格式串(JDOM解析)

    Java全面解析XML格式串(JDOM解析) import java.io.IOException; import java.io.StringReader; import java.util.List; import org.jdom.Document; import org.jdom.Element; import org.jdom.JDOMException; import org.jdom.Namespace; import org.jdom.input.SAXBuilder; impo

  • 在java中使用dom4j解析xml(示例代码)

    虽然Java中已经有了Dom和Sax这两种标准解析方式 但其操作起来并不轻松,对于我这么一个初学者来说,其中部分代码是活生生的恶心 为此,伟大的第三方开发组开发出了Jdom和Dom4j等工具 鉴于目前的趋势,我们这里来讲讲Dom4j的基本用法,不涉及递归等复杂操作 Dom4j的用法很多,官网上的示例有那么点儿晦涩,这里就不写了 首先我们需要出创建一个xml文档,然后才能对其解析 xml文档: 复制代码 代码如下: <?xml version="1.0" encoding=&quo

  • java读取解析xml文件实例

    读取本地的xml文件,通过DOM进行解析,DOM解析的特点就是把整个xml文件装载入内存中,形成一颗DOM树形结构,树结构是方便遍历和和操纵. DOM解析的特性就是读取xml文件转换为 dom树形结构,通过节点进行遍历. 这是W3c关于节点的概念 如果xml中包含有大量的数据,由于dom一次性把xml装入内存中的特性,所以dom不适合于包含大量数据的xml解析.当包含有大量xml的时候,用SAX进行解析比较节省内存. 下面是一个运用DOM进行解析xml文件的例子: xml文件结构如下: <?xm

  • java dom4j解析xml文件代码实例分享

    解析xml文件有两种方式,一种是利用Dom去解析,这种方式写起代码比较麻烦,对于刚入手的程序员来说比较容易出问题:第二种就是使用Dom4j包去解析在要使用Dom4j包的时候,肯定要先引入包 复制代码 代码如下: import java.io.File;import java.io.FileWriter;import java.io.IOException;import java.io.Writer;import java.util.Iterator; import org.dom4j.Docum

  • 使用jquery解析XML示例代码

    xml文件结构:books.xml <?xml version="1.0" encoding="UTF-8"?> <root> <book id="1"> <name>深入浅出extjs</name> <author>张三</author> <price>88</price> </book> <book id="

  • Python中使用ElementTree解析XML示例

    [XML基本概念介绍] XML 指可扩展标记语言(eXtensible Markup Language). XML 被设计用来传输和存储数据. 概念一: 复制代码 代码如下: <foo>      # foo元素的起始标签  </foo>     # foo元素的结束标签             # note: 每一个起始标签必须有对应的结束标签来闭合, 也可以写成<foo/> 概念二: 复制代码 代码如下: <foo>           # 元素可以嵌套

  • java dom4j解析xml用到的几个方法

    1. 读取并解析XML文档: 复制代码 代码如下: SAXReader reader = new SAXReader(); Document document = reader.read(new File(fileName)); reader的read方法是重载的,可以从InputStream, File, Url等多种不同的源来读取.得到的Document对象就带表了整个XML. 读取的字符编码是按照XML文件头定义的编码来转换.如果遇到乱码问题,注意要把各处的编码名称保持一致即可. 2. 取

  • java使用xpath解析xml示例分享

    XPath即为XML路径语言(XML Path Language),它是一种用来确定XML文档中某部分位置的语言.XPath基于XML的树状结构,提供在数据结构树中找寻节点的能力.起初 XPath 的提出的初衷是将其作为一个通用的.介于XPointer与XSL间的语法模型.但是 XPath 很快的被开发者采用来当作小型查询语言. XPathTest.java 复制代码 代码如下: package com.hongyuan.test; import java.io.File;import java

随机推荐