目录

简介

为什么学习XML?

什么是XML文件

XML语法格式

案例

Java解析XML 掌握 面试题 *

解析XML

解析XML案例

解析本地文件案例:

解析网络文件案例:

DOM4J - XPATH解析XML

路径表达式

使用步骤

案例

解析本地案例

解析网络文件:和上述网络文件案例一样

XML生成之XStream


简介

可扩展标记语言(eXtensible Markup Language)。 特性: 1. xml具有平台无关性, 是一门独立的标记语言. 2. xml具有自我描述性

为什么学习XML?

1. 网络数据传输. 2. 数据存储 3. 配置文件

(如果一个程序员写软件C语言,一个程序员写的是软件ava语言,二者怎样交流XML和Jason是首选格式)

什么是XML文件

.XML文件是保存XML数据的一种方式

XML数据也可以以其他的方式存在(如在内存中构建XML数据)。

不要将XML语言狭隘的理解成XML文件。

XML语法格式

1. XML文档声明

<?xml version="1.0 encoding="UTF-8"?>

2. 标记 ( 元素 / 标签 / 节点)

XML文档,由一个个的标记组成.

语法: 开始标记(开放标记):<标记名称>

结束标记(闭合标记): </标记名称>

标记名称:自定义名称,必须遵循以下命名规则:

1.名称可以含字母、数字以及其他的字符

2.名称不能以数字或者标点符号开始

3.名称不能以字符 “xml”(或者 XML、Xml)开始

4.名称不能包含空格,不能包含冒号(:)

5.名称区分大小写

标记内容: 开始标记与结束标记之间 ,是标记的内容.

例如 ,我们通过标记, 描述一个人名:

<name>李伟杰</name>

3. 一个XML文档中, 必须有且且仅允许有一个根标记.

正例: <names>

<name>张三</name>

<name>李四</name>

</names>

反例:

<name>张三</name>

<name>李四</name>

4. 标记可以嵌套, 但是不允许交叉.

5. 标记的层级称呼 (子标记, 父标记 , 兄弟标记, 后代标记 ,祖先标记)

例如:

<persons>

<person>

<name>李四</name>

<length> 180cm</length>

</person>

<person>

<name>李四 </name>

<length>200cm</length>

</person>

</persons>

name是person的子标记.也是person的后代标记

name是persons的后代标记.

name是length的兄弟标记.

person是name的父标记.

persons是name的祖先标记.

6. 标记名称 允许重复

7. 标记除了开始和结束 , 还有属性.

        标记中的属性, 在标记开始时 描述, 由属性名和属性值 组成.

格式:

在开始标记中, 描述属性.

可以包含0-n个属性, 每一个属性是一个键值对!

属性名不允许重复 , 键与值之间使用等号连接, 多个属性之间使用空格分割. 属性值 必须被引号引住.

案例:

<persons>

<person id ="1001">//id是属性

<name>李四</name>

</person>

</peersons>

8. 注释

    注释不能写在文档文档声明前

注释不能嵌套注释 格式: 注释开始:  <!--

注释结束:-->

案例

用XML描述一组图书books(通过记事本编写后缀名为.xml 编辑完成后不能直接双击打开可通过idea或eclipse打开查看格式是否正确)

<?xml version="1.0" encoding="UTF-8" ?>
<books><book id="1001"><name>面纱</name><info>请记住我,虽然再见必须说</info></book><book id="1002"><name>人生第一次</name><info>愿他们、我们的一生平淡而有意义</info></book>
</books> 

Java解析XML 掌握 面试题 *

问: Java中有几种XML解析方式 ? 分别是什么 ? 有什么样的优缺点 ?

答: 四种.

  1. SAX解析 解析方式是事件驱动机制 !

SAX解析器, 逐行读取XML文件解析 , 每当解析到一个标签的开始/结束/内容/属性时,触 发事件. 我们可以编写程序在这些事件发生时, 进行相应的处理.

优点:

分析能够立即开始,而不是等待所有的数据被处理

逐行加载,节省内存.有助于解析大于系统内存的文档

有时不必解析整个文档,它可以在某个条件得到满足时停止解析

缺点:

1. 单向解析,无法定位文档层次,无法同时访问同一文档的不同部分数据(因为逐 行解析, 当解析第n行是, 第n-1行已经被释放了, 无法在进行操作了).

2. 无法得知事件发生时元素的层次, 只能自己维护节点的父/子关系.

3. 只读解析方式, 无法修改XML文档的内容.

   2. DOM解析

是用与平台和语言无关的方式表示XML文档的官方W3C标准,分析该结构通常需要加载整个 文档和内存中建立文档树模型.程序员可以通过操作文档树, 来完成数据的获取 修改 删除等.

优点:

文档在内存中加载, 允许对数据和结构做出更改.

访问是双向的,可以在任何时候在树中双向解析数据。

缺点    : 文档全部加载在内存中 , 消耗资源大.

3. JDOM解析

目的是成为Java特定文档模型,它简化与XML的交互并且比使用DOM实现更快。由于是第一 个Java特定模型,JDOM一直得到大力推广和促进。

JDOM文档声明其目的是“使用20%(或更少)的精力解决80%(或更多)Java/XML问题” (根据学习曲线假定为20%)

优点:

使用具体类而不是接口,简化了DOM的API。

大量使用了Java集合类,方便了Java开发人员。

缺点:  没有较好的灵活性。 性能不是那么优异。

4. DOM4J解析

它是JDOM的一种智能分支。它合并了许多超出基本XML文档表示的功能,包括集成的XPath 支持、XML Schema支持以及用于大文档或流化文档的基于事件的处理。它还提供了构建文档表示的选项, DOM4J是一个非常优秀的Java XML API,具有性能优异、功能强大和极端易用使用的特点,同时它也是一 个开放源代码的软件。如今你可以看到越来越多的Java软件都在使用DOM4J来读写XML。 目前许多开源项目中大量采用DOM4J , 例如:Hibernate

解析XML

DOM4J解析XML步骤:

1. 引入jar文件 dom4j.jar

2. 创建一个指向XML文件的输入流

FileInputStream fis = new FileInputStream("xml文件的地址");

3. 创建一个XML读取工具对象

SAXReader sr = new SAXReader();

4. 使用读取工具对象, 读取XML文档的输入流 , 并得到文档对象

Document doc = sr.read(fis);

5. 通过文档对象, 获取XML文档中的根元素对象

Element root = doc.getRootElement();

文档对象 Document

指的是加载到内存的 整个XML文档.

常用方法:

1. 通过文档对象, 获取XML文档中的根元素对象

Element root = doc.getRootElement();

2. 添加根节点

Element root = doc.addElement("根节点名称");

元素对象 Element

指的是XML文档中的单个节点.

常用方法:

1. 获取节点名称

String getName();

2. 获取节点内容

String getText();

3. 设置节点内容

String setText();

4. 根据子节点的名称 , 获取匹配名称的第一个子节点对象

Element element(String 子节点名称);

5. 获取所有的子节点对象

List elements();

6. 获取节点的属性值

String attributeValue(String 属性名称);

7. 获取子节点的内容

String elementText(String 子节点名称);

8. 添加子节点

Element addElement(String 子节点名称);

9. 添加属性

void addAttribute(String 属性名,String 属性值);

解析XML案例

解析本地文件案例:

(以上述book的XML文件为例)

需要导入相应包

package com.java;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.List;public class Demo_1 {public static void main(String[] args) {try {
//            获取文件输入流“该地址为存放上述books的XML文件的地址FileInputStream fis = new FileInputStream("e:\\a_idea文件\\XML\\Demo.xml");
//          创建XML读取工具的对象SAXReader sr = new SAXReader();
//           通过读取工具,读取XML文档的输入流,并得到文档对象Document doc = sr.read(fis);
//            通过文档对象,获取文档的根节点对象Element root = doc.getRootElement();
//            输出根节点包含的内容System.out.println(root.getName());
//            获取根节点名称List<Element> es = root.elements();
//            循环遍历两个bookfor(Element e :es){
//                attributeValue:获取id属性值System.out.println(e.attributeValue("id"));
//               elementText:获取子节点 nameSystem.out.println(e.elementText("name"));
//                elementText:获取子节点 infoSystem.out.println(e.elementText("info"));}} catch (FileNotFoundException | DocumentException e) {e.printStackTrace();}}
}

解析网络文件案例:

"https://apis.juhe.cn/mobile/getphone="+phone+"&dtype=xml&key=9f3923e8f87f1ea50ed4ec8c39cc9253"该网址为一个网络接口,输入手机号可显示以下信息

(https://apis.juhe.cn/mobile/getphone=155154******&dtype=xml&key=9f3923e8f87f1ea50ed4ec8c39cc9253)

package com.java;import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;public class Demo_2 {public static void main(String[] args) throws IOException, DocumentException {String phone = "1551546***";
//        获取到XML资源的输入流URL url = new URL("https://apis.juhe.cn/mobile/get?phone="+phone+"&dtype=xml&key=9f3923e8f87f1ea50ed4ec8c39cc9253");
//       openConnection:打开链接URLConnection coon = url.openConnection();
//       获得网址下的输入流InputStream is = coon.getInputStream();
//     创建一个XML读取对象SAXReader sr = new SAXReader();
//          通过读取对象 读取XML数据,并返回文档对象Document doc = sr.read(is);
//getRootElement:获取根节点Element root = doc.getRootElement();
//        解析内容String code = root.elementText("resultcode");if("200".equals(code)){//如果返回码为200开始解析
//            讲解析的根节点返回给Element对象Element result = root.element("result");
//            讲解析的province返回给String对象String province = result.elementText("province");//            讲解析的city返回给String对象String city = result.elementText("city");if(province.equals(city)){//如果省份和城市相等直接返回城市名System.out.println("手机号码归属地"+city);}else{//否则返回省会加城市名System.out.println("手机号归属地"+province+" "+city);}}else{System.out.println("手机号有误");}}
}

DOM4J - XPATH解析XML

路径表达式

通过路径快速的查找一个或一组元素

路径表达式: 1. / : 从根节点开始查找

2. // : 从发起查找的节点位置 查找后代节点 ***

3.  .   : 查找当前节点

4.   ..   : 查找父节点

5. @ : 选择属性. *

属性使用方式:

[@属性名='值']

[@属性名>'值']

[@属性名<'值']

[@属性名!='值']

使用步骤

通过Node类的两个方法, 来完成查找: (Node是 Document 与 Element 的父接口)

方法1. //根据路径表达式, 查找匹配的单个节点

Element e = selectSingleNode("路径表达式");

//查找节点下的所有内容

方法2. List <Element>es = selectNodes("路径表达式");

案例

解析本地案例

package com.java;import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.io.SAXReader;import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.util.List;public class Demo_3 {public static void main(String[] args) {try {
//            获取文件输入流“该地址为存放上述books的XML文件的地址FileInputStream fis = new FileInputStream("e:\\a_idea文件\\XML\\Demo.xml");
//          创建XML读取工具的对象SAXReader sr = new SAXReader();
//           通过读取工具,读取XML文档的输入流,并得到文档对象Document doc = sr.read(fis);
//            Node是elememt和document的父
//            selectNodes:查找集合List<Node> names = doc.selectNodes("//name");for(int i =0;i<names.size();i++){System.out.println(names.get(i).getName());System.out.println(names.get(i).getText());}System.out.println("-------------");
//              selectSingleNode:查找单个Node n = doc.selectSingleNode("//book['id = 1001']//name");System.out.println(n.getName());System.out.println(n.getText());} catch (FileNotFoundException | DocumentException e) {e.printStackTrace();}}
}

解析网络文件:和上述网络文件案例一样

package com.java;import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.io.SAXReader;import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.net.URLConnection;public class Demo_4 {public static void main(String[] args) throws IOException, DocumentException {String phone = "15515464566";
//        获取到XML资源的输入流URL url = new URL("https://apis.juhe.cn/mobile/get?phone="+phone+"&dtype=xml&key=9f3923e8f87f1ea50ed4ec8c39cc9253");
//       openConnection:打开链接URLConnection coon = url.openConnection();
//       获得网址下的输入流InputStream is = coon.getInputStream();
//     创建一个XML读取对象SAXReader sr = new SAXReader();
//          通过读取对象 读取XML数据,并返回文档对象Document doc = sr.read(is);
//        selectSingleNode:查找单个Node n =doc.selectSingleNode("//province");System.out.println(n.getText());}
}

XML生成之XStream

package com.java;import com.thoughtworks.xstream.XStream;import java.util.Objects;public class Demo_5 {public static void main(String[] args) {Person p = new Person();p.setName("张三");p.setAge(18);//        XStream使用
//        创建XStream对象XStream x = new XStream();
//        修改某个类型生成的节点(可选的,默认为包名。类名)
//        吧Person类型更改为Student结点x.alias("Student",Person.class);
//        传入对象,开始生成String xml = x.toXML(p);System.out.println(xml);}static class Person{
private  String name ;
private  int age;public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public Person() {}@Overridepublic String toString() {return "Person{" +"name='" + name + '\'' +", age=" + age +'}';}@Overridepublic boolean equals(Object o) {if (this == o) return true;if (!(o instanceof Person)) return false;Person person = (Person) o;return age == person.age && Objects.equals(name, person.name);}@Overridepublic int hashCode() {return Objects.hash(name, age);}}
}

XML超详细(有案例)相关推荐

  1. 模板的超详细的案例讲解(上)

    函数模板 1.函数模板 案例: 2.用户指定T的类型 3.函数模板 和 普通函数的区别 案例: 案例2:函数模板的调用时机 4.函数模板的课堂练习 5.函数模板具体化 6.类模板 7.类模板作为函数的 ...

  2. dom4j 解析xml,生成xml超详细(webservice请求)

    一.使用dom4j创建xml文档 package cn.mars.app.txn.whpf;import java.io.FileOutputStream;import org.dom4j.Attri ...

  3. Google Earth Engine——生物多样性方面案例(在线获取采样点数据)分析超详细的案例介绍(1.5万字)

    生成采样数据 1简介 2背景 2.1关于数据

  4. SSM整合案例(超详细)

    SSM整合案例(超详细) 环境准备 前提须知 创建数据库和表结构 创建 Maven 工程 ssm 导入坐标并建立依赖 编写实体类 编写持久层接口 编写业务层接口 编写业务层实现类 编写 Control ...

  5. 超详细前端开发案例:品优购商场项目(二)

    目录 续前一篇内容 10. 品优购首页布局 10.4 nav 导航栏制作 10.5 footer 底部制作 10.6 mod_service 服务模块制作 10.7 main 主体模块制作 10.8 ...

  6. 全网最实用的 IDEA Debug 调试技巧(超详细案例)

    目录 前言 正文 Debug 的常见使用场景 基础操作 行断点(Line Breakpoints) 方法断点(Method Breakpoint) 字段断点(Field Watchpoints) 异常 ...

  7. HTML学习知识点大全-----超详细(各种标签使用讲解及案例)

    HTML学习知识点大全-----超详细(各种标签使用讲解及案例) 1:概念 **最基础的网页开发语言 *Hyper Text Markup language:超文本标记语言超文本:运用了超链接的方法, ...

  8. 如何保障缓存和数据库的一致性(超详细案例)【转载自 程序员囧辉】

    如何保障缓存和数据库的一致性(超详细案例)[转载自 程序员囧辉] 一.前言 二.正文 方案1:同步删除 1.1 核心流程 1.2 存在的问题 方案2:延迟双删 2.1 核心流程 2.2 存在的问题 方 ...

  9. 【03】Unity AR 2022Vuforia图片识别超详细案例(小岛动画交互)【含代码】

    Unity AR Vuforia(拓展)--Vuforia图片识别超详细案例(小岛动画交互)[含代码] 文章目录 Unity AR Vuforia(拓展)--Vuforia图片识别超详细案例(小岛动画 ...

最新文章

  1. 从零开始的自学之路——css选择器
  2. 回文树或者回文自动机,及相关例题
  3. ReenTrantLock可重入锁(和synchronized的区别)总结
  4. 讲字节数组转化为base64_Base64编码简介及简单实现
  5. 高效的企业测试–测试框架(5/6)
  6. XManager 远程访问 Ubuntu16.04 图形界面
  7. 我的“技术架构”之旅
  8. VScode 配置 Java 环境
  9. mybatis实现代码自动生成
  10. 基于JSP的鲜花商城源码
  11. PAT题集2019.6.25排名变动
  12. python的power,Python numpy.power()函数使用说明
  13. python中re.compile()用法详解
  14. 计算机丢失cxcore100.dll,cxcore100.dll
  15. Ajax传JSON对象报错:JSON parse error: Unrecognized token ‘ids‘: was expecting (‘true‘, ‘false‘ or ‘null‘);
  16. UTC与BJT时间换算C语言
  17. wyAPP苹果APP 营销
  18. Python3 正则表达式
  19. 丙腈PEG丙腈, CN-PEG-C
  20. Win11快捷键切换输入法无反应怎么办?快捷键切换输入法没有反应

热门文章

  1. 2022年Shell获取当前周数和java获取当前周数不一致问题
  2. git ——回退过去、回到未来
  3. 深度森林deep-forest | ImportError: cannot import name ‘_joblib_parallel_args‘ from ‘sklearn.utils.fixes‘
  4. FasterRCNN目标检测算法
  5. IdentityServer4总结
  6. SQLyog安装过程
  7. [UE4]战争迷雾 VaFogOfWar插件使用方法
  8. Python使用Reportlab处理PDF数据 - 图形和图表
  9. 有约束条件的优化问题求解推导
  10. sql服务器怎么删除日志文件,SQL数据库怎么删除日志ldf