博客已迁移到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. STS工具:mybayis连接oracle数据库

    1.pom.xml文件中的依赖 刚添加依赖的时候会报错,原因是jar包下不下来. 2.我的jdk是1.6,所以需要升级jdk版本到1.8 执行mvn -v命令,可以看到maven的版本号 DOS窗口执 ...

  2. java文件实现文件的上传和下载

    文件上传是最古老的互联网操作之一,20多年来几乎没有怎么变化,还是操作麻烦.缺乏交互.用户体验差. 一.前端代码 英国程序员Remy Sharp总结了这些新的接口 ,本文在他的基础之上,讨论在前端采用 ...

  3. js 选择文本

    怎么用js脚本,选中文本呢? // 获取selection对象 var selection = window.getSelection(); // 清空selection对象 selection.re ...

  4. c 判断是否为nan

    /* isnan example */ #include <stdio.h> /* printf */ #include <math.h> /* isnan, sqrt */ ...

  5. JavaWeb_(Spring框架)注解配置

    系列博文 JavaWeb_(Spring框架)xml配置文件  传送门 JavaWeb_(Spring框架)注解配置 传送门 Spring注解配置 a)导包和约束:基本包.aop包+context约束 ...

  6. IntelliJ跳转到抽象方法的实现

    ctrl + b (等价于ctrl + 鼠标点击方法名)会调到这个类型的抽象方法中: 如果想要跳转到这个方法的具体实现可以使用 ctrl + alt + 鼠标点击方法名. IntelliJ快速查找一个 ...

  7. ubuntu 16.04 脚本开机自启动

    1.首先编写一个shell脚本文件,例如python_self_start.sh (nohup & 指定后台运行) #!/bin/bash nohup python3 /home/senset ...

  8. 【java】Java.math.BigDecimal.subtract()方法实例

    java.math.BigDecimal.subtract(BigDecimal subtrahend) 返回一个BigDecimal,其值为 (this - subtrahend), 精度为 max ...

  9. Gurobi建模遇到的坑

    1.quicksum好像不支持嵌套 最好还是尽可能多的使用一些中间变量来表达. 另外,quicksum()返回的是表达式而不是var,像addGenConstrMax(resvar, [var, va ...

  10. 如何查看appPackage和启动appActivity

    安装apk,模拟器或真机中在前台运行该应用程序,获取appPackage,即应用包名 appPackage:  adb shell dumpsys activity | find "mFoc ...