XML 使用Stax 基于XPath 和XMLEventReader迭代模型 和过滤方式的解析

本文主要是介绍XML 使用Stax 基于XPath 和XMLEventReader迭代模型 和过滤方式的解析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

xml文件  放在src下

book.xml:

<?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">Learning XML</title>
  <author>Erik T. Ray</author>
  <year>2003</year>
  <price>39.95</price>
</book>

</bookstore>

 

 package xml.sg.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.XMLEventReader;
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamConstants;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamReader;
import javax.xml.stream.events.XMLEvent;
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 {
 // Stax解析xml
 @Test
 public void test01() {
  XMLInputFactory factory = XMLInputFactory.newInstance();
  InputStream stream = null;
  try {
   stream = TestStax.class.getClassLoader().getResourceAsStream(
     "book.xml");
   XMLStreamReader reader = factory.createXMLStreamReader(stream);
   while (reader.hasNext()) {
    int len = reader.next();
    // 判断是否是开始元素
    if (len == 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 {
   if (stream != null) {
    try {
     stream.close();
    } catch (IOException e) {
     e.printStackTrace();
    }
   }
  }
 }

 @Test
 public void test02() {
  XMLInputFactory factory = XMLInputFactory.newInstance();
  InputStream stream = null;
  try {
   stream = TestStax.class.getClassLoader().getResourceAsStream(
     "book.xml");
   XMLStreamReader reader = factory.createXMLStreamReader(stream);
   while (reader.hasNext()) {
    int len = reader.next();
    // 判断是否是开始元素
    if (len == XMLStreamConstants.START_ELEMENT) {
     String name = reader.getName().toString();
     if (name.equals("title")) {
      System.out.println(reader.getElementText() + ":");
     }
     if (name.equals("price")) {
      System.out.println(reader.getElementText() + "/n");
     }
    }
   }
  } catch (XMLStreamException e) {
   e.printStackTrace();
  } finally {
   if (stream != null) {
    try {
     stream.close();
    } catch (IOException e) {
     e.printStackTrace();
    }
   }
  }
 }

 @Test
 public void test03() {
  XMLInputFactory factory = XMLInputFactory.newInstance();
  InputStream stream = null;
  try {
   stream = TestStax.class.getClassLoader().getResourceAsStream(
     "book.xml");
   // 基于迭代模型操作
   XMLEventReader reader = factory.createXMLEventReader(stream);
   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.println(reader.getElementText() + ":");
     }
     if (name.equals("price")) {
      System.out.println(reader.getElementText() + "/n");
     }
    }
   }
  } catch (XMLStreamException e) {
   e.printStackTrace();
  } finally {
   if (stream != null) {
    try {
     stream.close();
    } catch (IOException e) {
     e.printStackTrace();
    }
   }
  }
 }

 @Test
 public void test04() {
  XMLInputFactory factory = XMLInputFactory.newInstance();
  InputStream stream = null;
  try {
   stream = TestStax.class.getClassLoader().getResourceAsStream(
     "book.xml");
   // 基于Filter的过滤方式 可以有效过滤掉不用进行操作的节点 效率更高一些
   XMLEventReader reader = factory.createFilteredReader(
     factory.createXMLEventReader(stream), new EventFilter() {
      @Override
      public boolean accept(XMLEvent event) {
       if (event.isStartElement()) {
        return true;
       }
       return false;
      }
     });
   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.println(reader.getElementText() + ":");
     }
     if (name.equals("price")) {
      System.out.println(reader.getElementText() + "\n");
     }
    }
   }
  } catch (XMLStreamException e) {
   e.printStackTrace();
  } finally {
   if (stream != null) {
    try {
     stream.close();
    } catch (IOException e) {
     e.printStackTrace();
    }
   }
  }
 }

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

 

 

 

这篇关于XML 使用Stax 基于XPath 和XMLEventReader迭代模型 和过滤方式的解析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/714278

相关文章

Java 正则表达式URL 匹配与源码全解析

《Java正则表达式URL匹配与源码全解析》在Web应用开发中,我们经常需要对URL进行格式验证,今天我们结合Java的Pattern和Matcher类,深入理解正则表达式在实际应用中... 目录1.正则表达式分解:2. 添加域名匹配 (2)3. 添加路径和查询参数匹配 (3) 4. 最终优化版本5.设计思

Java使用ANTLR4对Lua脚本语法校验详解

《Java使用ANTLR4对Lua脚本语法校验详解》ANTLR是一个强大的解析器生成器,用于读取、处理、执行或翻译结构化文本或二进制文件,下面就跟随小编一起看看Java如何使用ANTLR4对Lua脚本... 目录什么是ANTLR?第一个例子ANTLR4 的工作流程Lua脚本语法校验准备一个Lua Gramm

Java Optional的使用技巧与最佳实践

《JavaOptional的使用技巧与最佳实践》在Java中,Optional是用于优雅处理null的容器类,其核心目标是显式提醒开发者处理空值场景,避免NullPointerExce... 目录一、Optional 的核心用途二、使用技巧与最佳实践三、常见误区与反模式四、替代方案与扩展五、总结在 Java

使用Java将DOCX文档解析为Markdown文档的代码实现

《使用Java将DOCX文档解析为Markdown文档的代码实现》在现代文档处理中,Markdown(MD)因其简洁的语法和良好的可读性,逐渐成为开发者、技术写作者和内容创作者的首选格式,然而,许多文... 目录引言1. 工具和库介绍2. 安装依赖库3. 使用Apache POI解析DOCX文档4. 将解析

Qt中QUndoView控件的具体使用

《Qt中QUndoView控件的具体使用》QUndoView是Qt框架中用于可视化显示QUndoStack内容的控件,本文主要介绍了Qt中QUndoView控件的具体使用,具有一定的参考价值,感兴趣的... 目录引言一、QUndoView 的用途二、工作原理三、 如何与 QUnDOStack 配合使用四、自

Java字符串处理全解析(String、StringBuilder与StringBuffer)

《Java字符串处理全解析(String、StringBuilder与StringBuffer)》:本文主要介绍Java字符串处理全解析(String、StringBuilder与StringBu... 目录Java字符串处理全解析:String、StringBuilder与StringBuffer一、St

C++使用printf语句实现进制转换的示例代码

《C++使用printf语句实现进制转换的示例代码》在C语言中,printf函数可以直接实现部分进制转换功能,通过格式说明符(formatspecifier)快速输出不同进制的数值,下面给大家分享C+... 目录一、printf 原生支持的进制转换1. 十进制、八进制、十六进制转换2. 显示进制前缀3. 指

Spring Boot循环依赖原理、解决方案与最佳实践(全解析)

《SpringBoot循环依赖原理、解决方案与最佳实践(全解析)》循环依赖指两个或多个Bean相互直接或间接引用,形成闭环依赖关系,:本文主要介绍SpringBoot循环依赖原理、解决方案与最... 目录一、循环依赖的本质与危害1.1 什么是循环依赖?1.2 核心危害二、Spring的三级缓存机制2.1 三

C#中async await异步关键字用法和异步的底层原理全解析

《C#中asyncawait异步关键字用法和异步的底层原理全解析》:本文主要介绍C#中asyncawait异步关键字用法和异步的底层原理全解析,本文给大家介绍的非常详细,对大家的学习或工作具有一... 目录C#异步编程一、异步编程基础二、异步方法的工作原理三、代码示例四、编译后的底层实现五、总结C#异步编程

使用Python构建一个Hexo博客发布工具

《使用Python构建一个Hexo博客发布工具》虽然Hexo的命令行工具非常强大,但对于日常的博客撰写和发布过程,我总觉得缺少一个直观的图形界面来简化操作,下面我们就来看看如何使用Python构建一个... 目录引言Hexo博客系统简介设计需求技术选择代码实现主框架界面设计核心功能实现1. 发布文章2. 加