XML

XML

概述

Exendsible Markup Language(XML)可扩展标记语言

用途:

  1. 数据存储,小型数据库,存在一定CRUD操作可行性
  2. 网络数据的传输
  3. JavaWEB项目配置文件

基本语法

  1. XML文件后缀名为.xml
  2. XML文件第一行是对于当前文件的定义声明
  3. XML文件中有且只有一个根标签
  4. 属性值必须使用引号包含,推荐使用双引号
  5. 标签必须正确匹配,即正确开始和关闭
  6. XML标签内严格区分大小写
<?xml version="1.0" encoding="utf-8"?>
<users><user id="1"><name>ocean</name><age>18</age><gender>male</gender></user>
</users>

文档组成部分

1.文档声明a.格式<?xml 属性列表 ?><?xml version="1.0" encoding="utf-8"?>version:当前的XML文件版本号encoding:编码方式,这里建议XML文件的保存编码集和对应的解析编码集一致standalone:是否依赖于其他文件[了解]            yes 不依赖 no 依赖  2.指令(了解即可)            可以导入css样式3.标签内容自定义规则:a.自定义标签允许使用英文字母,数字和其他标点符号b.不允许使用数字和标点开头,只能用英文字母c.不允许在自定义标签内使用xml标记,XML也不行d.名字不允许出现空格4.属性可以给标签一个属性,有时候要求ID属性是唯一的5.文本(了解)CDATA区,所见即所得

XML文件数据约束

  1. DTD

    简单的约束方法

    存在一定的约束问题

  2. Schema

    复杂的XML文件约束方式

    非常严谨

DTD实例:

student.dtd

<!-- students 根标签 要求根标签内存放student -->
<!ELEMENT students (student*) >
<!-- student标签包含子标签的内容 -->
<!ELEMENT student (name,age,sex)>
<!-- 所有子标签当前数据都都是文本形式 -->
<!ELEMENT name (#PCDATA)>
<!ELEMENT age (#PCDATA)>
<!ELEMENT sex (#PCDATA)>
<!-- ATTLIST Attribute List 属性列表 student id ID -->
<!ATTLIST student id ID #REQUIRED>

student.xml

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE students SYSTEM "D:\NZ\IEDA\Day25_SL_IDEA\src\com\qfedu\b_dtd\student.dtd">
<!--<!DOCTYPE students [-->
<!--        &lt;!&ndash; students 根标签 要求根标签内存放student &ndash;&gt;-->
<!--        <!ELEMENT students (student*) >-->
<!--        &lt;!&ndash; student标签包含子标签的内容 &ndash;&gt;-->
<!--        <!ELEMENT student (name,age,sex)>-->
<!--        &lt;!&ndash; 所有子标签当前数据都都是文本形式 &ndash;&gt;-->
<!--        <!ELEMENT name (#PCDATA)>-->
<!--        <!ELEMENT age (#PCDATA)>-->
<!--        <!ELEMENT sex (#PCDATA)>-->
<!--        &lt;!&ndash; ATTLIST Attribute List 属性列表 student id ID &ndash;&gt;-->
<!--        <!ATTLIST student id ID #REQUIRED>-->
<!--        ]>-->
<students><student id="qf1"><name>骚磊</name><age>fdasfdsaf</age><sex>male</sex></student><student id="qf2"><name>骚磊</name><age>16</age><sex>male</sex></student>
</students>
Schema实例:

student.xml

<?xml version="1.0" encoding="utf-8"?><!--
1. 填写根节点约束
2. 引入xsi前缀,xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
3. 引入xsd文件命名空间 xsi:schemaLocation="http://www.qfedu.com/xml  student.xsd"
4. 为xsd约束声明一个前缀,作为表示
-->
<students   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns="http://www.qfedu.com/xml"xsi:schemaLocation="http://www.qfedu.com/xml  student.xsd"
><student id="gp_0001"><name>骚磊</name><age>5</age><sex>male</sex></student><student id="gp_0002"><name>骚杰</name><age>17</age><sex>male</sex></student>
</students>

student.xsd

<?xml version="1.0"?>
<xsd:schema xmlns="http://www.qfedu.com/xml"xmlns:xsd="http://www.w3.org/2001/XMLSchema"targetNamespace="http://www.qfedu.com/xml" elementFormDefault="qualified"><!-- 根节点名字和包含的内容,内容是自定义studentType --><xsd:element name="students" type="studentsType"/><!-- studentType类型声明   --><xsd:complexType name="studentsType"><xsd:sequence><!-- students根节点中存放的是student类型  type="studentType" 要求student的个数从0开始 个数不限制 --><xsd:element name="student" type="studentType" minOccurs="0" maxOccurs="unbounded"/></xsd:sequence></xsd:complexType><!-- studentType声明 --><xsd:complexType name="studentType"><xsd:sequence><!-- 要求student标签内有name,age,sex子标签,并且要求对一个对应保存的数据类型是type指定 --><xsd:element name="name" type="xsd:string"/><!-- ageType 和 sexType 是自定义数据约束 --><xsd:element name="age" type="ageType" /><xsd:element name="sex" type="sexType" /></xsd:sequence><!-- 给予Student标签属性 属性为id,要声明idType, use="required"不可缺少的 --><xsd:attribute name="id" type="idType" use="required"/></xsd:complexType><!-- sexType性别类型声明 --><xsd:simpleType name="sexType"><xsd:restriction base="xsd:string"><!-- 有且只有两个数据 male female --><xsd:enumeration value="male"/><xsd:enumeration value="female"/></xsd:restriction></xsd:simpleType><xsd:simpleType name="ageType"><xsd:restriction base="xsd:integer"><!-- 0 ~ 256 要求范围,是一个integer类型 --><xsd:minInclusive value="0"/><xsd:maxInclusive value="256"/></xsd:restriction></xsd:simpleType><xsd:simpleType name="idType"><xsd:restriction base="xsd:string"><!-- ID类型,要求gp_xxxx(四位数字) --><xsd:pattern value="gp_\d{4}"/></xsd:restriction></xsd:simpleType>
</xsd:schema>

XML解析

XML解析思路

  • DOM解析

    Document Object Model文档对象模型

    把XML整个文件看作一个Document对象,把每一个节点看作一个Element,节点中有Attribute,或者当前节点中存在Text文本内容

    DOM是将整个XML文件读取到计算机内存中,可以进行CRUC操作

    缺点:占用了大量的内存空间

  • SAX解析

    逐行读取,基于一定的事件操作

    读取一行内容,释放上一行内容,可以有效节约内存空间

    读取操作为主

    使用的环境:

    手机读取解析XML文件时采用的操作

DOM解析图示

XML文件解析工具

  1. JAXP:sun提供的基本的解析器,支持DOM和SAX两种解析方式,但是操作繁琐,不便于程序开发

  2. Dom4j:DOM For Java

    优秀的解析器

    Spring, SpringMVC框架中集成的XML解析器

  3. Jsoup:基于Java完成的对于HTML解析的工具,HTML和XML都是标记语言

    给Jsoup一个URL,Java小爬虫,API较多,方便

  4. PULL

    Android手机上集成的XML解析工具,SAX方式解析

Dom4j使用
  1. 导包

    使用第三方工具,不是原生JDK,所以需要导入第三方jar包

    IDEA导包方法

    1.新建lib文件夹

    2.将jar文件拖入lib文件夹

    3.设置关联

    选中目录

    点击ok

    参与编译,点击ok

    jar包处于可以打开状态,设置完毕

Dom4j解析方法:
SAXReader();解析XML文件使用的核心类read() --> XML文件Document对象
Document document = new SAXReader().read(new File("./path"));Document对象中可以使用的方法:Element getRootElement();获取当前XML文件的根节点Element对象中可以使用的方法:List elements();当前节点下的所有子节点List elements(String name);获取当前节点下所有指定名字的子节点Element element()获取当前节点下第一个子节点Element element(String name)            获取当前节点下指定名字的第一个子节点Attribute getAttribute(String name);根据属性名获取对应的属性对象AttributeAttribute节点中可以使用String getValue()来获取对应的节点数据            String getName();获取当前节点的名字String getText();获取当前节点对应的文本数据

实例:

User.xml

<?xml version="1.0" encoding="utf-8"?>
<users><teacher id="1"><name>ocean</name><age>19</age><gender>male</gender></teacher>
</users>
package cn.ocean888.a_xmlparse;import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;import java.io.File;
import java.util.List;public class Demo1 {public static void main(String[] args) throws DocumentException {File file = new File("./xml/User.xml");// 创建一个SAXReader Dom4j操作XML文件的核心类SAXReader saxReader = new SAXReader();// 当前XML文件的Document对象Document document = saxReader.read(file);// 建议直接一步// Document document = new SAXReader.read(new File("./xml/User.xml"));// 获取根节点Root ELementElement rootElement = document.getRootElement();System.out.println(rootElement);System.out.println("======================");// 获取Root Element下子节点List<Element> elementList = rootElement.elements();for (Element element : elementList) {System.out.println(element);}System.out.println("======================");// 可以获取当前当前节点下所有子节点Element teacher = rootElement.element("teacher");System.out.println(teacher);System.out.println("======================");List<Element> elementList1 = teacher.elements();for (Element element : elementList1) {System.out.println(element.getName() + ":" + element.getText());}System.out.println("======================");// 获取指定节点属性值System.out.println(teacher.attribute("id").getValue());}
}

运行结果:

Dom4j Xpath解析
  1. 创建Document对象
  2. 获取根节点
  3. 获取所需节点
package cn.ocean888.a_xmlparse;import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.io.SAXReader;import java.io.File;
import java.util.List;public class Demo2 {public static void main(String[] args) throws DocumentException {// 当前XML文件的Document对象Document document = new SAXReader().read(new File("./xml/User.xml"));// 获取根节点 Root ElementElement rootElement = document.getRootElement();// 无视目录结构和解析状态,直接获取所有的user节点List list = rootElement.selectNodes("//user");for (Object o:list ) {Element element = (Element) o;int id = Integer.parseInt(element.attributeValue("id"));String name = element.element("name").getText();int age = Integer.parseInt(element.element("age").getText());String gender = element.element("gender").getText();System.out.println("User[id=" + id + ", name" + name + ", age" + age + ", gender" + gender + "]");}System.out.println("==================================");System.out.println();// //user[index] 不考虑路径关系,获取当前XML文件中单个指定的user节点Node node = rootElement.selectSingleNode("//user[1]");System.out.println(node);System.out.println("==================================");System.out.println();// //user[@id=9] 不考虑路径Node node1 = rootElement.selectSingleNode("//user[@id=9]");System.out.println(node1);System.out.println("==================================");System.out.println();// //user[gender='male'] 不考虑路径关系,获取当前XML文件中指定子文件为gender,对应子节点文本为male的节点List list1 = rootElement.selectNodes("//user[gender='male']");for (Object o:list1) {System.out.println(o);}System.out.println("==================================");System.out.println();List list2 = rootElement.selectNodes("//user[age<20]");for (Object o:list2) {System.out.println(o);}}
}

public class Demo3 {public static void main(String[] args) throws DocumentException {Document read = new SAXReader().read(new File("./xml/User.xml"));Element rootElement = read.getRootElement();// //user[last()] 这里不是考虑路径关系,获取最后一个user节点Node node = rootElement.selectSingleNode("//user[last()]");System.out.println(node);System.out.println("====================================");System.out.println();// //user[position()<3] 不考虑路径关系,获取前两个User节点List list = rootElement.selectNodes("//user[position()<3]");for (Object o:list) {System.out.println(o);}System.out.println("====================================");// //name | //age 无视路径关系,获取所有的name节点和age节点List list1 = rootElement.selectNodes("//name | //age");for (Object o:list1) {// 允许强转Element element = (Element) o;System.out.println(element.getText());}}
}

XML文件保存

流程:

  1. 创建Document对象

  2. 通过Document对象来添加元素

    addElement();

    addAttribute();

Java基础-xml解析相关推荐

  1. Java之XML解析-使用dom(org.w3c.dom)解析XML

    转自: Java之XML解析-使用dom(org.w3c.dom)解析XML 下文笔者将讲述使用W3C(org.w3c.dom)提供的接口,解析XML文档的方法分享 W3C解析xml文档的方法:将整个 ...

  2. Java中Xml解析详解 DOM、SAX、JDOM、DOM4J

    1.1 什么是XML 一种表示结构化信息的标准方法,以使计算机能够方便地使用此类信息,并且人们可以非常方便地编写和理解这些信息.XML 是 eXtensible Markup Language(可扩展 ...

  3. Java之xml解析(Sax方式)

    文章目录 一. Sax基本介绍: 二. java 编码实现解析xml Sax解析流程 DefaultHandler各方法介绍 XML与java对象之间的转换 1.xml文件的内容 2.XML与java ...

  4. java俄文xml解析错误,XML解析出错处理

    搜索热词 正常解析完毕之后会直接走parserDidEndDocument这个方法 解析出错之后会执行一个相应的方法,- (void)parser:(NSXMLParser*)parser parse ...

  5. java 字符串xml,解析java中的xml字符串?

    how do you parse xml stored in a java string object? Java's XMLReader only parses XML documents from ...

  6. Java 基础——数组解析

    数组对于每一门编辑应语言来说都是重要的数据结构之一,当然不同语言对数组的实现及处理也不尽相同. Java语言中提供的数组是用来存储固定大小的同类型元素. 可以声明一个数组变量,如numbers[100 ...

  7. java对xml解析_Java中对xml的解析

    // 1.通过DocumentBuilderFactor创建解析工厂 DocumentBuilderFactory builderFactory = DocumentBuilderFactory .n ...

  8. java cdata xml 解析,如何解析lt;![CDATA []]gt;的XML

    How to parse a XML having data included in 解决方案 public static void main(String[] args) throws Except ...

  9. java基础题 解析_Java基础面试题及答案解析(10)

    点击上方"Java知音",选择"置顶公众号"java 技术文章第一时间送达!web 归纳的解释下线程的几种状态spa 就绪(Runnable):线程准备运行,不 ...

最新文章

  1. php7 实战 新闻类,楼+之PHP7实战第1期
  2. 23hibernate_pessimistic_locking
  3. 面试--java实现一个多人图文聊天室(c/s或b/s),写出思路
  4. shell脚本中的引用
  5. 计网 - 网络 I/O 模型:BIO、NIO 和 AIO 有什么区别?
  6. 【转】使 用免费UMS架设Flash流媒体服务
  7. Bzoj2656 [Zjoi2012]数列(sequence)
  8. Java集合工具类:Collections
  9. python程序化 k线指定时间更新_Python之路 14 K线时间序列管理器
  10. 面试官:你对多线程熟悉吗,谈谈线程安全中的原子性,有序性和可见性?
  11. 为什么我 11 岁的儿子说要放弃编程,却又转战 Python
  12. vue代码如何跟后端代码结合_阿里云服务器优惠购买教程,可获得800元代金券,云服务器仅需82元/年_学云网...
  13. 〖2011.08.19〗秋无痕常用软件全功能装机光盘2011年八月版(支持64位WIN7)
  14. 计算机图形学入门-线性代数复习
  15. mysql 5.6.21 winx64_mysql-advanced-5.6.21-winx64部署及使用
  16. Python学习笔记六——画小猪佩奇
  17. HQL语句的基本语法和使用
  18. opencv 图像拼接
  19. 什么样的企业/单位需要圣天诺LDK?
  20. 愿你三冬暖,愿你春不寒

热门文章

  1. js中内存泄漏的几种情况
  2. 【VUE】两种vue跳转地址传递参数的方法
  3. 泰坦尼克号幸存者预测(案例)----决策树版
  4. Git 操作从入门到精通
  5. 【文献调研】FiT(feed-in-tariff)新能源上网补贴定价方式调研
  6. 根据分类好的图片将相应的json文件提取出来
  7. request.getParameter()获取不到数据的问题
  8. C语言数据类型(超详细)
  9. plsql 12 oracle home,plsql连接远程oracle home怎样设置
  10. 【Python零基础到入门】Python预备知识必备篇——Python简介