当前位置: 首页 > news >正文

第一百八十八节 Java XML教程 - Java StAX

Java XML教程 - Java StAX

StAX是为了解决SAX和DOM API中的限制而创建的。

StAX API允许我们请求下一个事件(拉动事件),并允许状态以过程方式存储。

XML解析有两种编程模型:流和文档对象模型(DOM)。

DOM模型涉及创建表示整个文档树的内存对象。DOM树可以自由导航。 成本是一个大的内存占用。这对于小文档来说是可以的,但是当文档变得更大时,内存消耗可能会迅速上升。

流是指其中XML数据被串行解析的编程模型。在文档中,我们只能在一个位置查看XML数据。这意味着我们需要在读取XML文档之前知道XML结构。用于XML处理的流模型在存在内存限制时很有用。

拉式解析vs推式解析

当我们想获取(拉取)XML数据时,我们做流式拉解析。

当解析器发送数据时,无论客户端是否准备好使用它,我们都进行流式推送解析。

StAX拉解析器可以过滤XML文档并忽略元素不必要。

StAX是一个双向API,通过它我们可以读取和写入XML文档。 SAX是只读的。

SAX是一个推送API,而StAX是拉式。

例子

此程序演示如何使用StAX解析器。它打印XHTML网页的所有超链接链接。

import java.io.InputStream;
import java.net.URL;import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamConstants;
import javax.xml.stream.XMLStreamReader;public class Main {public static void main(String[] args) throws Exception {URL url = new URL("http://www.w3c.org");InputStream in = url.openStream();XMLInputFactory factory = XMLInputFactory.newInstance();XMLStreamReader parser = factory.createXMLStreamReader(in);while (parser.hasNext()) {int event = parser.next();if (event == XMLStreamConstants.START_ELEMENT) {if (parser.getLocalName().equals("a")) {String href = parser.getAttributeValue(null, "href");if (href != null)System.out.println(href);}}}}
}

例2

下面的代码显示了如何使用XML流读取器加载XML文档。

import java.io.File;
import java.io.FileInputStream;import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamConstants;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamReader;public class Main {public static void main(String[] args) throws Exception {File file = new File("yourXML.xml");FileInputStream inputStream = new FileInputStream(file);XMLInputFactory inputFactory = XMLInputFactory.newInstance();XMLStreamReader reader = inputFactory.createXMLStreamReader(inputStream);System.out.println(reader.getVersion());System.out.println(reader.isStandalone());System.out.println(reader.standaloneSet());System.out.println(reader.getEncoding());System.out.println(reader.getCharacterEncodingScheme());parseRestOfDocument(reader);}private static void parseRestOfDocument(XMLStreamReader reader)throws XMLStreamException {while (reader.hasNext()) {int type = reader.next();switch (type) {case XMLStreamConstants.START_ELEMENT:System.out.println(reader.getLocalName());if (reader.getNamespaceURI() != null) {String prefix = reader.getPrefix();if (prefix == null) {prefix = "[None]";}System.out.println("prefix = "" + prefix + "", URI = ""+ reader.getNamespaceURI() + """);}if (reader.getAttributeCount() > 0) {for (int i = 0; i < reader.getAttributeCount(); i++) {System.out.println("Attribute (name = ""+ reader.getAttributeLocalName(i) + "", value = ""+ reader.getAttributeValue(i) + "")");String attURI = reader.getAttributeNamespace(i);if (attURI != null) {String attPrefix = reader.getAttributePrefix(i);if (attPrefix == null || attPrefix.equals("")) {attPrefix = "[None]";}System.out.println("prefix=" + attPrefix + ",URI=" + attURI);}}}break;case XMLStreamConstants.END_ELEMENT:System.out.println("XMLStreamConstants.END_ELEMENT");break;case XMLStreamConstants.CHARACTERS:if (!reader.isWhiteSpace()) {System.out.println("CD:" + reader.getText());}break;case XMLStreamConstants.DTD:System.out.println("DTD:" + reader.getText());break;case XMLStreamConstants.SPACE:System.out.println(" ");break;case XMLStreamConstants.COMMENT:System.out.println(reader.getText());break;default:System.out.println(type);}}}
}

XMLStreamWriter

以下代码显示了如何使用 XMLStreamWriter 输出xml。

import javax.xml.stream.XMLOutputFactory;
import javax.xml.stream.XMLStreamWriter;public class Main {public static void main(String[] args) throws Exception {XMLOutputFactory factory = XMLOutputFactory.newInstance();XMLStreamWriter writer = factory.createXMLStreamWriter(System.out);writer.writeStartDocument("1.0");writer.writeStartElement("catalog");writer.writeStartElement("book");writer.writeAttribute("id", "1");writer.writeStartElement("code");writer.writeCharacters("I01");writer.writeEndElement();writer.writeStartElement("title");writer.writeCharacters("This is the title");writer.writeEndElement();writer.writeStartElement("price");writer.writeCharacters("$2.95");writer.writeEndElement();writer.writeEndDocument();writer.flush();writer.close();}
}

上面的代码生成以下结果。

XMLEventReader

import java.io.FileReader;
import java.io.Reader;
import java.util.Iterator;import javax.xml.namespace.QName;
import javax.xml.stream.XMLEventReader;
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.events.Attribute;
import javax.xml.stream.events.Characters;
import javax.xml.stream.events.EndElement;
import javax.xml.stream.events.StartElement;
import javax.xml.stream.events.XMLEvent;public class Main {public static void main(String[] args) throws Exception {XMLInputFactory factory = XMLInputFactory.newInstance();Reader fileReader = new FileReader("Source.xml");XMLEventReader reader = factory.createXMLEventReader(fileReader);while (reader.hasNext()) {XMLEvent event = reader.nextEvent();if (event.isStartElement()) {StartElement element = (StartElement) event;System.out.println("Start Element: " + element.getName());Iterator iterator = element.getAttributes();while (iterator.hasNext()) {Attribute attribute = (Attribute) iterator.next();QName name = attribute.getName();String value = attribute.getValue();System.out.println("Attribute name/value: " + name + "/" + value);}}if (event.isEndElement()) {EndElement element = (EndElement) event;System.out.println("End element:" + element.getName());}if (event.isCharacters()) {Characters characters = (Characters) event;System.out.println("Text: " + characters.getData());}}}
}

XMLEventWriter

import java.util.Arrays;
import java.util.List;import javax.xml.stream.XMLEventFactory;
import javax.xml.stream.XMLEventWriter;
import javax.xml.stream.XMLOutputFactory;
import javax.xml.stream.events.Attribute;
import javax.xml.stream.events.Characters;
import javax.xml.stream.events.EndDocument;
import javax.xml.stream.events.EndElement;
import javax.xml.stream.events.StartDocument;
import javax.xml.stream.events.StartElement;public class Main {public static void main(String[] args) throws Exception {XMLOutputFactory outputFactory = XMLOutputFactory.newInstance();XMLEventWriter writer = outputFactory.createXMLEventWriter(System.out);XMLEventFactory xmlEventFactory = XMLEventFactory.newInstance();StartDocument startDocument = xmlEventFactory.createStartDocument("UTF-8", "1.0");writer.add(startDocument);StartElement startElement = xmlEventFactory.createStartElement("", "", "My-list");writer.add(startElement);Attribute attribute = xmlEventFactory.createAttribute("version", "1");List attributeList = Arrays.asList(attribute);List nsList = Arrays.asList();StartElement startElement2 = xmlEventFactory.createStartElement("", "", "Item",attributeList.iterator(), nsList.iterator());writer.add(startElement2);StartElement codeSE = xmlEventFactory.createStartElement("", "", "code");writer.add(codeSE);Characters codeChars = xmlEventFactory.createCharacters("I001");writer.add(codeChars);EndElement codeEE = xmlEventFactory.createEndElement("", "", "code");writer.add(codeEE);StartElement nameSE = xmlEventFactory.createStartElement(" ", " ", "name");writer.add(nameSE);Characters nameChars = xmlEventFactory.createCharacters("a name");writer.add(nameChars);EndElement nameEE = xmlEventFactory.createEndElement("", "", "name");writer.add(nameEE);StartElement contactSE = xmlEventFactory.createStartElement("", "", "contact");writer.add(contactSE);Characters contactChars = xmlEventFactory.createCharacters("another name");writer.add(contactChars);EndElement contactEE = xmlEventFactory.createEndElement("", "", "contact");writer.add(contactEE);EndDocument ed = xmlEventFactory.createEndDocument();writer.add(ed);writer.flush();writer.close();}
}

上面的代码生成以下结果。

StreamFilter

import java.io.FileInputStream;import javax.xml.namespace.QName;
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamReader;
import javax.xml.stream.events.XMLEvent;public class Main implements javax.xml.stream.StreamFilter {public static void main(String[] args) throws Exception {String filename = "yourXML.xml";XMLInputFactory xmlif = null;xmlif = XMLInputFactory.newInstance();xmlif.setProperty(XMLInputFactory.IS_REPLACING_ENTITY_REFERENCES,Boolean.TRUE);xmlif.setProperty(XMLInputFactory.IS_SUPPORTING_EXTERNAL_ENTITIES,Boolean.FALSE);xmlif.setProperty(XMLInputFactory.IS_NAMESPACE_AWARE, Boolean.TRUE);xmlif.setProperty(XMLInputFactory.IS_COALESCING, Boolean.TRUE);System.out.println("FACTORY: " + xmlif);System.out.println("filename = " + filename);FileInputStream fis = new FileInputStream(filename);XMLStreamReader xmlr = xmlif.createFilteredReader(xmlif.createXMLStreamReader(fis), new Main());int eventType = xmlr.getEventType();printEventType(eventType);while (xmlr.hasNext()) {eventType = xmlr.next();printEventType(eventType);printName(xmlr, eventType);printText(xmlr);if (xmlr.isStartElement()) {printAttributes(xmlr);}printPIData(xmlr);}}public static final String getEventTypeString(int eventType) {switch (eventType) {case XMLEvent.START_ELEMENT:return "START_ELEMENT";case XMLEvent.END_ELEMENT:return "END_ELEMENT";case XMLEvent.PROCESSING_INSTRUCTION:return "PROCESSING_INSTRUCTION";case XMLEvent.CHARACTERS:return "CHARACTERS";case XMLEvent.COMMENT:return "COMMENT";case XMLEvent.START_DOCUMENT:return "START_DOCUMENT";case XMLEvent.END_DOCUMENT:return "END_DOCUMENT";case XMLEvent.ENTITY_REFERENCE:return "ENTITY_REFERENCE";case XMLEvent.ATTRIBUTE:return "ATTRIBUTE";case XMLEvent.DTD:return "DTD";case XMLEvent.CDATA:return "CDATA";}return "UNKNOWN_EVENT_TYPE";}private static void printEventType(int eventType) {System.out.print("EVENT TYPE(" + eventType + "):");System.out.println(getEventTypeString(eventType));}private static void printName(XMLStreamReader xmlr, int eventType) {if (xmlr.hasName()) {System.out.println("HAS NAME: " + xmlr.getLocalName());} else {System.out.println("HAS NO NAME");}}private static void printText(XMLStreamReader xmlr) {if (xmlr.hasText()) {System.out.println("HAS TEXT: " + xmlr.getText());} else {System.out.println("HAS NO TEXT");}}private static void printPIData(XMLStreamReader xmlr) {if (xmlr.getEventType() == XMLEvent.PROCESSING_INSTRUCTION) {System.out.println(" PI target = " + xmlr.getPITarget());System.out.println(" PI Data = " + xmlr.getPIData());}}private static void printAttributes(XMLStreamReader xmlr) {if (xmlr.getAttributeCount() > 0) {System.out.println("\nHAS ATTRIBUTES: ");int count = xmlr.getAttributeCount();for (int i = 0; i < count; i++) {QName name = xmlr.getAttributeName(i);String namespace = xmlr.getAttributeNamespace(i);String type = xmlr.getAttributeType(i);String prefix = xmlr.getAttributePrefix(i);String value = xmlr.getAttributeValue(i);System.out.println("ATTRIBUTE-PREFIX: " + prefix);System.out.println("ATTRIBUTE-NAMESP: " + namespace);System.out.println("ATTRIBUTE-NAME:   " + name.toString());System.out.println("ATTRIBUTE-VALUE:  " + value);System.out.println("ATTRIBUTE-TYPE:  " + type);}} else {System.out.println("HAS NO ATTRIBUTES");}}public boolean accept(XMLStreamReader reader) {if (!reader.isStartElement() && !reader.isEndElement()) {return false;} else {return true;}}
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 前端 package.json 的每一项作用
  • 初始化列表的基本介绍
  • 数学建模~~追逐仿真问题
  • 无人机培训机构推广运营理论技术
  • Python中各类常用内置转换函数
  • uniapp免费申请苹果证书教程每次7天可用于测试
  • Redis,MongoDB,Memcached未授权访问漏洞(及其修复方法)
  • NOI Linux 2.0 的安装说明以及使用指南
  • 使用 podman 推送数据到私有仓库的 3 个问题记录
  • 【知识】PyTorch中的数据类型dtype
  • MAVSDK添加自定义消息与函数实现云台(Gimbal)调整功能
  • 【Python爬虫实例爬取网站搞笑段子】
  • 线程池个人笔记总结
  • 编程-设计模式 7:桥接模式
  • pandas赋值不成功
  • 【跃迁之路】【699天】程序员高效学习方法论探索系列(实验阶段456-2019.1.19)...
  • 4月23日世界读书日 网络营销论坛推荐《正在爆发的营销革命》
  • bearychat的java client
  • Bytom交易说明(账户管理模式)
  • Eureka 2.0 开源流产,真的对你影响很大吗?
  • Flannel解读
  • Intervention/image 图片处理扩展包的安装和使用
  • java小心机(3)| 浅析finalize()
  • JS基础篇--通过JS生成由字母与数字组合的随机字符串
  • Js实现点击查看全文(类似今日头条、知乎日报效果)
  • niucms就是以城市为分割单位,在上面 小区/乡村/同城论坛+58+团购
  • orm2 中文文档 3.1 模型属性
  • React+TypeScript入门
  • Sass 快速入门教程
  • tensorflow学习笔记3——MNIST应用篇
  • vue-router的history模式发布配置
  • windows下如何用phpstorm同步测试服务器
  • 关于for循环的简单归纳
  • 基于Dubbo+ZooKeeper的分布式服务的实现
  • 前端临床手札——文件上传
  • 前端每日实战:61# 视频演示如何用纯 CSS 创作一只咖啡壶
  • 深度学习中的信息论知识详解
  • 我的zsh配置, 2019最新方案
  • 以太坊客户端Geth命令参数详解
  • 译米田引理
  • 原生 js 实现移动端 Touch 滑动反弹
  • 在GitHub多个账号上使用不同的SSH的配置方法
  • PostgreSQL之连接数修改
  • 回归生活:清理微信公众号
  • 微龛半导体获数千万Pre-A轮融资,投资方为国中创投 ...
  • ​​​【收录 Hello 算法】9.4 小结
  • #pragma预处理命令
  • $ is not function   和JQUERY 命名 冲突的解说 Jquer问题 (
  • (1)STL算法之遍历容器
  • (7)svelte 教程: Props(属性)
  • (草履虫都可以看懂的)PyQt子窗口向主窗口传递参数,主窗口接收子窗口信号、参数。
  • (定时器/计数器)中断系统(详解与使用)
  • (二)丶RabbitMQ的六大核心
  • (附源码)ssm经济信息门户网站 毕业设计 141634
  • (四)opengl函数加载和错误处理