博客已迁移到CSDN《https://blog.csdn.net/qq_33375499

XML值可扩展标记语言,是用来传输和存储数据的。

XMl的特定:

  1. XMl文档必须包含根元素。该元素是所有其他元素的父元素。XML文档中的元素形成了一颗文档树,树中的每个元素都可存在子元素。
  2. 所有XML元素都必须有关闭标签。
  3. XML标签对大小写敏感,并且所有属性值date都需加引号。

XML元素:

XMl元素是只从包括开始标签到结束标签的部分,元素可包含其他元素、文本或两者都包含,也可拥有属性。

XML解析

基础方法:DOM、SAX

DOM解析:平台无关的官方解析方式

SAX解析:Java中基于事件驱动的解析方式

扩展方法:JDOM、DOM4J (在基础方法上扩展的,只有Java能够使用的解析方式)

1.DOM解析

    优点:

      ·形成了树结构,直观好理解

      ·解析过程中树结构保留在内存中方便修改

    缺点:

      ·当xml文件较大时,对内存消耗比较大,容易影响解析性能,并造成内存溢出

import org.w3c.dom.*;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import java.util.LinkedList;
import java.util.List; /**
* DOM 解析xml
*/
public class DOM {
public static void main(String[] args) throws Exception {
// 1.创建 DocumentBuilderFactory 对象
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
// 2.通过 DocumentBuilderFactory对象创建 DocumentBuilder对象
DocumentBuilder db = dbf.newDocumentBuilder();
// 3.使用 DocumentBuilder对象来加载xml
Document document = db.parse("bean.xml");
System.out.println("----------------- DOM开始解析 xml -----------------");
// 获取 xml 文件的根节点
Element element = document.getDocumentElement();
getNoeMsg(element);
System.out.println("\n\n----------------- DOM结束解析 xml -----------------");
} /**
* 获取Node节点信息
* @param node
*/
public static void getNoeMsg(Node node){
if(node.getNodeType() == Node.ELEMENT_NODE){
System.out.print("<" + node.getNodeName());
getNodeAttrs(node);
System.out.print(">\n");
NodeList nodeList = node.getChildNodes();
// 筛选出节点类型为ELEMENT_NODE 的节点
List<Node> list = getNodeList(nodeList);
Node childNode;
int len = list.size();
if(len == 0){
System.out.print(node.getTextContent() + "\n");
}else {
for (int i = 0; i < len; i++){
if(list.get(i).getNodeType() == Node.ELEMENT_NODE){
childNode = list.get(i);
getNoeMsg(childNode);
}
}
}
System.out.println("</" + node.getNodeName() + ">");
}
} /**
* 获取Node节点的属性信息
* @param node
*/
public static void getNodeAttrs(Node node){
NamedNodeMap attrs = node.getAttributes();
Node attr;
if(attrs.getLength() != 0){
for (int i = 0, len = attrs.getLength(); i < len; i++){
attr = attrs.item(i);
System.out.print(" " + attr.getNodeName() + "='");
System.out.print(attr.getNodeValue() + "'");
}
}
} /**
* 筛选出节点类型为ELEMENT_NODE 的节点
* @param nodeList
* @return
*/
public static List<Node> getNodeList(NodeList nodeList){
List<Node> list = new LinkedList<>();
for (int i = 0,len = nodeList.getLength(); i < len; i++){
if(nodeList.item(i).getNodeType() == Node.ELEMENT_NODE){
list.add(nodeList.item(i));
}
}
return list;
}
}

2.SAX解析

    优点:

      ·采用事件驱动模式,对内存消耗比较小

      ·适用于只需处理xml中数据时

    缺点:

      ·不易编码

      ·很难同时访问同一个xml中的多处不同数据

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler; import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory; public class SAX {
public static void main(String[] args) throws Exception {
// 1.创建SAXParserFactory对象
SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();
// 2.通过SAXParserFactory对象创建 SAXParser
SAXParser saxParser = saxParserFactory.newSAXParser();
// 3.通过SAXParser加载xml,并传入 DefaultHandler 类型的对象进行解析
saxParser.parse("bean.xml", new SAXParserHandler());
} static class SAXParserHandler extends DefaultHandler{
/**
* 解析xml开始执行方法
* @throws SAXException
*/
@Override
public void startDocument() throws SAXException {
super.startDocument();
System.out.print("============= SAX开始解析xml =============\n");
} /**
* 解析xml结束执行方法
* @throws SAXException
*/
@Override
public void endDocument() throws SAXException {
super.endDocument();
System.out.print("\n============= SAX结束解析xml =============");
} /**
* 解析节点开始执行方法
* @param uri
* @param localName
* @param qName
* @param attributes
* @throws SAXException
*/
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
super.startElement(uri, localName, qName, attributes);
System.out.print("<" + qName);
for (int i = 0,len = attributes.getLength(); i < len; i++){
System.out.print(" " + attributes.getQName(i) + "='");
System.out.print(attributes.getValue(i) + "'");
}
System.out.print(">");
} /**
* 解析节点结束执行方法
* @param uri
* @param localName
* @param qName
* @throws SAXException
*/
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
super.endElement(uri, localName, qName);
System.out.print("</" + qName + ">");
} @Override
public void characters(char[] ch, int start, int length) throws SAXException {
super.characters(ch, start, length);
String str = new String(ch, start, length);
System.out.print(str);
}
}
}

3.JDOM解析

    特征:

      ·使用了具体类,不使用接口。

      ·API大量使用了Collections类,源码开源

import org.jdom.Attribute;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.JDOMException;
import org.jdom.input.SAXBuilder; import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.List; /**
* <!-- 引入JDOM依赖包 -->
* <dependency>
* <groupId>org.jdom</groupId>
* <artifactId>jdom</artifactId>
* <version>1.1</version>
* </dependency>
*/
public class JDOM {
public static void main(String[] args) throws IOException, JDOMException {
// 1.创建SAXBuilder对象
SAXBuilder saxBuilder = new SAXBuilder();
// 2.获取xml文件输入流
InputStream in = new FileInputStream("bean.xml");
// 3.通过SAXBuilder对象的build方法,将xml文件输入流添加到SAXBuilder对象中
Document document = saxBuilder.build(in);
// 4.获取xml根节点
Element rootElement = document.getRootElement();
// 5.根据根节点解析xml
printNodeMsg(rootElement);
} public static void printNodeMsg(Element element){
System.out.print("<" + element.getName());
// 获取节点的属性
printAttrmsg(element);
System.out.print(">\n");
List<Element> elements = element.getChildren();
for (Element e : elements){
if(e.getChildren().size() > 0){
printNodeMsg(e);
}else {
System.out.print("<" + e.getName());
printAttrmsg(e);
System.out.print(">");
System.out.print(e.getValue());
System.out.print("</" + e.getName() + ">\n");
}
}
System.out.print("</" + element.getName() + ">\n");
} /**
* 获取节点的属性
* @param element
*/
public static void printAttrmsg(Element element){
List<Attribute> attributes = element.getAttributes();
for (Attribute attribute : attributes){
System.out.print(" " + attribute.getName() + "='" + attribute.getValue() + "'");
}
}
}

4.DOM4J解析

    特征:

    ·使用了接口和抽象基本类方法

    ·具有性能优异、灵活性好、功能强大和极端易用的特点。

    ·开源

import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader; import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.util.Iterator; /**
* <!-- dom4j依赖包 -->
* <dependency>
* <groupId>dom4j</groupId>
* <artifactId>dom4j</artifactId>
* <version>1.6.1</version>
* </dependency>
*/
public class DOM4J {
public static void main(String[] args) throws FileNotFoundException, DocumentException {
// 1.创建SAXReader对象
SAXReader saxReader = new SAXReader();
// 2.通过SAXReader对象的read方法,加载xml输入流
Document document = saxReader.read(new FileInputStream("bean.xml"));
// 3.通过Document对象获取xml的根节点
Element rootElement = document.getRootElement();
// 4.通过根节点解析xml
printNodeMsg(rootElement);
} public static void printNodeMsg(Element element){
System.out.print("<" + element.getName());
// 获取节点的属性
printAttrmsg(element);
System.out.print(">\n");
Iterator<Element> elementIterator = element.elementIterator();
Element e;
while (elementIterator.hasNext()){
e = elementIterator.next();
if(e.elementIterator().hasNext()){
printNodeMsg(e);
}else {
System.out.print("<" + e.getName());
printAttrmsg(e);
System.out.print(">");
System.out.print(e.getStringValue());
System.out.print("</" + e.getName() + ">\n");
}
}
System.out.print("</" + element.getName() + ">\n");
} /**
* 获取节点的属性
* @param element
*/
public static void printAttrmsg(Element element){
Iterator<Attribute> attributeIterator = element.attributeIterator();
Attribute attribute;
while (attributeIterator.hasNext()){
attribute = attributeIterator.next();
System.out.print(" " + attribute.getName() + "='" + attribute.getValue() + "'");
}
}
}

java xml解析方式(DOM、SAX、JDOM、DOM4J)的更多相关文章

  1. Java解析XML汇总(DOM/SAX/JDOM/DOM4j/XPath)

    [目录] 一.[基础知识——扫盲] 二.[DOM.SAX.JDOM.DOM4j简单使用介绍] 三.[性能测试] 四.[对比] 五.[小插曲XPath] 六.[补充] 关键字:Java解析xml.解析x ...

  2. - XML 解析 总结 DOM SAX PULL MD

    目录 目录 XML 解析 总结 DOM SAX PULL MD 几种解析方式简介 要解析的内容 DOM 解析 代码 输出 SAX 解析 代码 输出 JDOM 解析 代码 输出 DOM4J 解析 代码 ...

  3. java解析xml的方式DOM,SAX,DOM4J,JDOM,StAX

    1)DOM(JAXP Crimson解析器)DOM是用与平台和语言无关的方式表示XML文档的官方W3C标准.DOM是以层次结构组织的节点或信息片断的集合.这个层次结构允许开发人员在树中寻找 特定信息. ...

  4. Java 解析 xml 常见的4中方式:DOM SAX JDOM DOM4J

    Java 四种解析 XML 的特点 1.DOM 解析: 形成了树结构,有助于更好的理解.掌握,且代码容易编写. 解析过程中,树结构保存在内存中,方便修改. 2.SAX 解析: 采用事件驱动模式,对内存 ...

  5. JAVA解析XML文件(DOM,SAX,JDOM,DOM4j附代码实现)

    1.解析XML主要有四种方式 1.DOM方式解析XML(与平台无关,JAVA提供,一次性加载XML文件内容,形成树结构,不适用于大文件) 2.SAX方式解析XML(基于事件驱动,逐条解析,适用于只处理 ...

  6. JAVA与DOM解析器提高(DOM/SAX/JDOM/DOM4j/XPath) 学习笔记二

    要求 必备知识 JAVA基础知识.XML基础知识. 开发环境 MyEclipse10 资料下载 源码下载   sax.dom是两种对xml文档进行解析的方法(没有具体实现,只是接口),所以只有它们是无 ...

  7. XML概念定义以及如何定义xml文件编写约束条件java解析xml DTD XML Schema JAXP java xml解析 dom4j 解析 xpath dom sax

    本文主要涉及:xml概念描述,xml的约束文件,dtd,xsd文件的定义使用,如何在xml中引用xsd文件,如何使用java解析xml,解析xml方式dom sax,dom4j解析xml文件 XML来 ...

  8. XML的解析方式(DOM、SAX、StAX)

    (新)  XML的解析方式(DOM.SAX.StAX) 博客分类: XML   一般来说,解析XML文件存在着两种方式,一种是event-based API,比如说象SAX,XNI. 第二种是tree ...

  9. Java XML解析工具 dom4j介绍及使用实例

    Java XML解析工具 dom4j介绍及使用实例 dom4j介绍 dom4j的项目地址:http://sourceforge.net/projects/dom4j/?source=directory ...

随机推荐

  1. Hihocoder #1142 : 三分·三分求极值

    1142 : 三分·三分求极值 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 这一次我们就简单一点了,题目在此: 在直角坐标系中有一条抛物线y=ax^2+bx+c和一个 ...

  2. 【概率论】4-2:期望的性质(Properties of Expectation)

    title: [概率论]4-2:期望的性质(Properties of Expectation) categories: - Mathematic - Probability keywords: - ...

  3. 收藏加备用。ext.xfs文件系统 文件恢复

    注意 当确认误删除文件后立刻使用各种方式阻止新数据在写入该分区了. 设置只读或umount都可以 ext2 3 4 文件系统 可以用 extundelete 这个工具来恢复. github地址: ht ...

  4. dosbox+masm汇编环境的安装和使用

    1. 下载dosbox安装程序:DOSBox0.74-win32-installer.exe 链接:https://pan.baidu.com/s/1gXPKTT-xKb6BpjOJdhmudA 密码 ...

  5. Egyptian Collegiate Programming Contest (ECPC 2015)

    题目链接:https://vjudge.net/contest/155219#overview. A题,用全排列来找出比当前这个数字字典序还大的排列有几个,然后前缀和dp即可.据说可以康拓展开来快速找 ...

  6. Selenium处理页面懒加载方法

    在做selenium webdriver  在做UI自动化时,有些页面时使用懒加载的形式显示页面图片,如果在不向下移动滚动条时,获取到的图片会是网站的默认图片和真实的图片不相符. 1.滑动滚动条 1. ...

  7. html5获取地理位置和定位

    1.H5地理位置定位功能 首先判断用户浏览器是否支持该功能,目前大多数现代浏览器均支持,获取位置信息需用户授权同意 function getLocation(){ if (navigator.geol ...

  8. docker 容器内部访问宿主机

    在宿主机执行: ifconfig 然后查看 docker0 的那个网卡的 ip 地址,比如我的是 172.18.0.1

  9. Echarts 设置 图标 默认平铺 数据为零时绘画

    好久没写了 最近接了一个统计的功能  以前写的都是一些最基础的统计 废话少说  我先把自己遇到的问题列出来 仅供参考 __________________我是分割线__________________ ...

  10. spaCy 第二篇:语言模型

    spaCy处理文本的过程是模块化的,当调用nlp处理文本时,spaCy首先将文本标记化以生成Doc对象,然后,依次在几个不同的组件中处理Doc,这也称为处理管道.语言模型默认的处理管道依次是:tagg ...