xml简单理解,xml增删改操作,仅作笔记,不作为学习借鉴

XML文档

来定义语义约束,要复杂一些,但是功能强大的多。

XML Schema指定丰富的类型,而且允许开发者自定义数据类型,因此完全可以处理更加复杂的语义约束场景。

XML Schema简称XSD(XML Schema Definition ),是DTD的替代者,既可以定义XML文档结构,也可以定义XML文档的内容约束

XML Schema的优势所在

==============================================================================

可读性强:本身就是一个XML文档

支持数据类型:比如日期类型,并且限制日期范围都没有问题

可扩展:导入其他的Schema,自定义数据类型、一个XML文档使用多个XML Schema

JavaEE、JavaEE开源框架中都大量使用了XML文档,其语义约束也己经陆续从之前的DTD约束升级为Schema约束

在这里插入图片描述

定义XML Schema文件shiporder.xsd

==========================================================================================

<?xml version="1.0" encoding="ISO-8859-1" ?>

<xs:schema xmlns:xs=“http://www.w3.org/2001/XMLSchema”>

<xs:element name=“orderperson” type=“xs:string”/>

<xs:element name=“name” type=“xs:string”/>

<xs:element name=“address” type=“xs:string”/>

<xs:element name=“city” type=“xs:string”/>

<xs:element name=“country” type=“xs:string”/>

<xs:element name=“title” type=“xs:string”/>

<xs:element name=“note” type=“xs:string”/>

<xs:element name=“quantity” type=“xs:positiveInteger”/>

<xs:element name=“price” type=“xs:decimal”/>

<xs:attribute name=“orderid” type=“xs:string”/>

<xs:element name=“shipto”>

xs:complexType

xs:sequence

<xs:element ref=“name”/>

<xs:element ref=“address”/>

<xs:element ref=“city”/>

<xs:element ref=“country”/>

</xs:sequence>

</xs:complexType>

</xs:element>

<xs:element name=“item”>

xs:complexType

xs:sequence

<xs:element ref=“title”/>

<xs:element ref=“note” minOccurs=“0”/>

<xs:element ref=“quantity”/>

<xs:element ref=“price”/>

</xs:sequence>

</xs:complexType>

</xs:element>

<xs:element name=“shiporder”>

xs:complexType

xs:sequence

<xs:element ref=“orderperson”/>

<xs:element ref=“shipto”/>

<xs:element ref=“item” maxOccurs=“unbounded”/>

</xs:sequence>

<xs:attribute ref=“orderid” use=“required”/>

</xs:complexType>

</xs:element>

</xs:schema>

DOM解析XML

=======================================================================

XML解析四种方式

========================================================================

XML作为一种数据传输工具,肯定离不开XML文档的读写。XML本身是结构化文档,如果依旧使用普通的IO流读写,效率低下,编程繁琐。目前常用的XML解析技术主要有四种

DOM和SAX

是XML解析的两种规范,目前主流的XML解析器都会为DOM和SAX提供实现

使用这两种技术解析XML比较繁琐,代码冗长,可读性也不高。

所以Java领域中又出现了两个开源的XML解析器:

DOM4J和JDOM

其中DOM4J是面向接口编程,而JDOM是面向实现编程。DOM4j比JDOM更灵活,性能表现也比较优异

在这里插入图片描述

DOM:Document Object Model 文档对象模型

===============================================================================================

使用该技术解析XML文档时,会根据要操作的文档,构建一棵驻留在内存中的树,然后就可以使用DOM接口来操作这棵树。

由于树是驻留在内存中,所以非常方便各种操作。但是也因为这棵树包含了XML文档的所有内容,是比较耗费资源的。

该方式适合小文档的解析、适合多次访问的文档的解析

在这里插入图片描述

SAX:Simple API for XML

=====================================================================================

是基于事件的解析,它是为了解决DOM解析的资源耗费而出现的。

SAX在解析一份XML文档时,会依次触发文档开始、元素开始、元素结束、文档结束等事件,

应用程序通过监听解析过程中所触发的事件即可获取XML文档的内容

该方式不需要事先调入整个文档,优势是占用资源少,内存消耗小,一般在解析数据量较大的文档是采用该方式

在这里插入图片描述

DOM4J: DOM for Java

==================================================================================

开源的XML解析工具,完全支持DOM、SAX机制,具有性能优异、功能强大和操作简单等特点。越来越多的Java软件都在使用DOM4J处理XML文档

JDOM: Java DOM

=============================================================================

JDOM的目的是成为Java特定文档模型。行至半路,一部分人产生了新的想法,而这些想法又无法在JDOM中实现,干脆就从该项目中分离出来,单独去开发另外一套专属的XML API,这就是DOM4J。因此,两者具有相同的设计目的,用法也非常相似。从组中解决来看,

JDOM的主要API以类为主,DOM4J的API以接口为主

Java对DOM和SAX两种规范都提供了支持。Java解析XML文档的API称为JAXP(Java API for XMLProcessing),作为JDK的一部分发布。其中javax.xml.parsers包中提供了四个与DOM和SAX解析相关的类。

如果使用DOM解析,就使用org.w3c.dom包下的类和接口。如果使用SAX解析,就使用org.xml.sax包下的类和接口

在这里插入图片描述

认识DOM

====================================================================

DOM,Document Object Model。将XML文档解析为一棵树,XML文档的节点对应DOM树的节点,

节点之间保持父子、兄弟关系。并且DOM树中的每个节点都是一个对象,如果要解析该文档,使用面向对象的思想调用节点的属性和方法即可。

可以对该树进行添加、查询、修改、删除等操作,最终会转换为对对应XML文档的操作

在这里插入图片描述

Node类


Node类是DOM树中节点的父类。根据具体类型可以分为多个子类,比如元素节点类Element、属性节点类Attr、文本节点类Text等。另外还有注释类Comment、文档类Document。

Document类代表整个XML文档本身,对整个文档进行操作的入口。Document对象中包含一个根节点。

这个应该是DOM有自己的一个数结构,其中有很多自身的子类,其中包括元素节点类Element、属性节点类Attr、文本节点类等,在里面还有一个文档类Document。它代表的是文档本身,也就是xml文档,他在里面也形成了一个树形结构

在这里插入图片描述

用DOM解析XML

========================================================================

public class TestDOM {

public static void main(String[] args) throws ParserConfigurationException,

SAXException, IOException {

// 1.创建DOM解析器工厂

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();

// 2.由DOM解析器工厂创建DOM解析器

DocumentBuilder db = dbf.newDocumentBuilder();

// 3.由DOM解析器解析文档,生成DOM树

Document doc = db.parse(“module2/student2.xml”);

// 4.解析DOM树,获取文档内容(元素 属性 文本)

// 4.1获取根元素students

NodeList studentsList = doc.getElementsByTagName(“students”);

// NodeList studentsList = doc.getChildNodes();

// System.out.println(studentsList.getLength());

Node studentsNode = studentsList.item(0);// students根节点

// 4.2获取students中所有的子元素student

NodeList studentList = studentsNode.getChildNodes();

// System.out.println(studentList.getLength());//空白也算节点

// 4.3对每个student进行处理

for (int i = 0; i < studentList.getLength(); i++) {

// 获取第i个节点

Node studentNode = studentList.item(i);

// System.out.println(studentNode.getNodeType());

if (studentNode.getNodeType() == Node.ELEMENT_NODE) {// Node.ELEMENT_NODE

// :1

// 获取每个学生的id属性及其值

Element stuElem = (Element) studentNode;

String value = stuElem.getAttribute(“id”);

System.out.println(“id----->” + value);

// 获取每个学生的name,age,score

NodeList nasList = stuElem.getChildNodes();

// System.out.println(nasList.getLength());

for (int j = 0; j < nasList.getLength(); j++) { // 7

// 获取第j个节点

Node nasNode = nasList.item(j);

// 只处理Element,不处理空白

if (nasNode.getNodeType() == Node.ELEMENT_NODE) {// 3

// 得到元素节点

Element nasElem = (Element) nasNode;

// 获取元素名称

String name = nasElem.getNodeName();

// 获取元素的文本

String content = nasElem.getTextContent();

// 输出元素的名称和文本

System.out.println(name + “----” + content);

}

}

System.out.println();

}

}

}

}

studentNode.getNodeType()的解读

===========================================================================================

node是节点的意思,那么它可能是文字内容、CDATA段、元素、属性等等,具体是什么,就要靠NodeType来判断节点的类型。

ELEMENT_NODE是一个枚举值,代表元素节点类型。

所以if(node.getNodeType()==Node.ELEMENT_NODE)的意思就是:

如果当前节点是元素节点的话。

缺点

1)繁琐:前面三个步骤相同,也需要书写一遍。能否封装好

2)繁琐:getChildNodes()不仅包括Element,也包括空白形成的Text,遍历时需要进行筛选

繁琐:getChildNodes()也包括注释、也包括外部DTD引用,大部分情况下并不是用户需要的

| | |

| — | — |

| | |

使用DOM4J解析XML

===========================================================================

DOM4J是一套开源的XML解析工具。与利用DOM、SAX、JAXP机制来解析XML相比,DOM4J 表现更优秀,具有性能优异、功能强大和极端易用使用的特点,只要懂得DOM基本概念,就可以通过DOM4J的API文档来解析XML。DOM4J是一套开源的API。实际项目中,往往选择DOM4J来作为解析XML的利器。

DOM4J在很大程度上简化了XML的处理方式。从表面上看,DOM4J有点类似DOM的解析机制,也将XML文档转换为一棵结构化树(称为DOM4J树吧),但是DOM4J的处理方式比DOM树更简单

在这里插入图片描述

在这里插入图片描述

使用DOM4J解析XML

===========================================================================

public static void main(String[] args) throws DocumentException {

//1.根据xml文件创建DOM树

SAXReader reader = new SAXReader();

//2、解析指定的xml文件

Document dom = reader.read(new File(“D:\ASXTCourse\JavaSE2\xml\src\student.xml”));

//3、获得根节点元素对象 就是students

Element rootElement = dom.getRootElement();

//4、获得students下的子节点

// List elements = rootElement.elements();

List elements2 = rootElement.elements(“student”);

for (Element e:elements2) {

// System.out.println(e.attribute(“id”).getValue());//获得指定节点属性的值

//student元素下的子节点

List list2 = e.elements();

for (Element e2:list2) {

System.out.println(e2.getName());//获得节点元素名称

System.out.println(e2.getText());//获得节点的文本内容

System.out.println(“-----------------------”);

}

}

}

技能点1:DOM4J对底层原始的XML解析器进行了高度封装,正是这种封装简化了XML处理。在DOM4J的org.dom4j.io包下提供了如下几个类:

DOMReader:根据W3C的DOM树创建DOM4J树

SAXReader:基于SAX解析机制解析一份XML文档,并将其转换为DOM4J树

技能点2:获取属性

获取所有属性 List attributes = elem.attributes();

获取指定属性 Attribute attr = elem.attribute(“id”);

attr.getName()+“:”+attr.getValue() 获取属性名和属性值

技能点3:获取元素

Element rootElem = doc.getRootElement(); 获取根元素

List stuList = rootElem.elements(); 获取所有名称的子元素列表

List stuList = rootElem.elements(“student”);获取指定名称子元素列表

String ename = subElem.getName(); 获取元素名称

属性就是设置标签的属性,而元素, 就是标签开始到最后结束,中间所包含的东西,比如

abc

abc就是元素

使用DOM4J完成添加操作

============================================================================

public class TestDom4j2 {

public static void main(String[] args) throws DocumentException, IOException {

//1.创建一个DocumentFactory对象

//DocumentFactory factory = new DocumentFactory();

//2.创建一个Document对象

//Document doc = factory.createDocument();

Document doc = DocumentHelper.createDocument();

doc.addComment(“student list”);

//3.获取DOM树的根节点students

Element rootElem = doc.addElement(“students”);

//4.在DOM树中给students添加子节点

Element stuElem = rootElem.addElement(“student”);

stuElem.addAttribute(“id”,“003”);//id属性

Element stuAgeElem = stuElem.addElement(“age”);//age子元素

stuAgeElem.setText(“30”);

Element stuNameElem = stuElem.addElement(“name”); //name子元素

stuNameElem.setText(“张三”);

Element stuScoreElem = stuElem.addElement(“score”);//score子元素

stuScoreElem.setText(“97”);

//5.将DOM树最新数据写入XML文件

OutputFormat format = OutputFormat.createPrettyPrint();//精致美观格式

//OutputFormat format = OutputFormat.createCompactFormat();//紧密压缩格式

format.setEncoding(“utf-8”);

Writer fw = new FileWriter(“module2/student3.xml”);

//XMLWriter xmlWriter = new XMLWriter(System.out,format);

XMLWriter xmlWriter = new XMLWriter(fw,format);

xmlWriter.write(doc);

xmlWriter.close();

}

}

技能点1:如何创建新文档Document:

DocumentFactory:使用了工厂模式

DocumentHelper:底层还是调用了DocumentFactory

技能点2:如何添加子元素

Element stuElem = rootElem.addElement(“student”);

stuElem.addAttribute(“id”,“003”);//id属性

Element stuAgeElem = stuElem.addElement(“age”);//age子元素

stuAgeElem.setText(“30”);

技能点3:如何写数据到XML文件

XMLWriter xmlWriter = new XMLWriter(fw,format);

createPrettyPrint:精致美观格式,带缩进、有换行,格式美观

createCompactFormat:紧密压缩格式,无缩进、无换行,不推荐

添加元素到已存在的文件(默认最后一个子元素)

=====================================================================================

public class TestDom4j3 {

public static void main(String[] args) throws DocumentException, IOException {

//1.根据xml文件创建DOM树

SAXReader reader = new SAXReader();

File file = new File(“module2/student3.xml”);

Document doc = reader.read(file);

//2.获取DOM树的根节点

Element rootElem = doc.getRootElement();

//3.在DOM树中给students添加子节点

Element stuElem = rootElem.addElement(“student”);

stuElem.addAttribute(“id”,“005”);

Element stuAgeElem = stuElem.addElement(“age”);

stuAgeElem.setText(“32”);

Element stuNameElem = stuElem.addElement(“name”);

stuNameElem.setText(“王五”);

Element stuScoreElem = stuElem.addElement(“score”);

stuScoreElem.setText(“100”);

//4.将DOM树最新数据写入XML文件

OutputFormat format = OutputFormat.createPrettyPrint();

format.setEncoding(“utf-8”);

Writer fw = new FileWriter(“module2/student3.xml”);

XMLWriter xmlWriter = new XMLWriter(fw,format);

xmlWriter.write(doc);

xmlWriter.close();

}

}

添加元素到已存在的文件(指定位置)

================================================================================

public class TestDom4j4 {

public static void main(String[] args) throws DocumentException, IOException {

//1.根据xml文件创建DOM树

SAXReader reader = new SAXReader();

File file = new File(“module2/student2.xml”);

Document doc = reader.read(file);

//2.获取DOM树的根节点students

Element rootElem = doc.getRootElement();

//3.在DOM树中给students添加子节点到指定位置

List list = rootElem.elements(“student”);

Element stuElem =DocumentHelper.createElement(“student”);

stuElem.addAttribute(“id”,“002”);

Element stuAgeElem = stuElem.addElement(“age”);

stuAgeElem.setText(“30”);

Element stuNameElem = stuElem.addElement(“name”);

stuNameElem.setText(“李四”);

Element stuScoreElem = stuElem.addElement(“score”);

stuScoreElem.setText(“90”);

list.add(1,stuElem);

//4.将DOM树最新数据写入XML文件

OutputFormat format = OutputFormat.createPrettyPrint();

format.setEncoding(“utf-8”);

Writer fw = new FileWriter(“module2/student3.xml”);

XMLWriter xmlWriter = new XMLWriter(fw,format);

xmlWriter.write(doc);

xmlWriter.close();

}

}

技能点1:添加元素到指定位置

List list = rootElem.elements(“student”);

Element stuElem =DocumentHelper.createElement(“student”);

list.add(1,stuElem);

使用DOM4J完成删除修改操作

==============================================================================

public class TestDom4j5 {

public static void main(String[] args) throws DocumentException, IOException {

//1.根据xml文件创建DOM树

SAXReader reader = new SAXReader();

File file = new File(“module2/student3.xml”);

Document doc = reader.read(file);

//2.获取DOM树的根节点students

Element rootElem = doc.getRootElement();

//3.在DOM树中给students删除子节点

List list = rootElem.elements(“student”);

for (int i = 0; i <list.size() ; i++) {

Element elem = list.get(i);

if(elem.attribute(“id”).getValue().equals(“003”)){

//list.remove(elem);

rootElem.remove(elem);

break;

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

最后

关于面试刷题也是有方法可言的,建议最好是按照专题来进行,然后由基础到高级,由浅入深来,效果会更好。当然,这些内容我也全部整理在一份pdf文档内,分成了以下几大专题:

  • Java基础部分

  • 算法与编程

  • 数据库部分

  • 流行的框架与新技术(Spring+SpringCloud+SpringCloudAlibaba)

这份面试文档当然不止这些内容,实际上像JVM、设计模式、ZK、MQ、数据结构等其他部分的面试内容均有涉及,因为文章篇幅,就不全部在这里阐述了。

作为一名程序员,阶段性的学习是必不可少的,而且需要保持一定的持续性,这次在这个阶段内,我对一些重点的知识点进行了系统的复习,一方面巩固了自己的基础,另一方面也提升了自己的知识广度和深度。
《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门即可获取!
95%以上Java开发知识点,真正体系化!**

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

最后

关于面试刷题也是有方法可言的,建议最好是按照专题来进行,然后由基础到高级,由浅入深来,效果会更好。当然,这些内容我也全部整理在一份pdf文档内,分成了以下几大专题:

  • Java基础部分

[外链图片转存中…(img-yxZndB5U-1712247413400)]

  • 算法与编程

[外链图片转存中…(img-TH3K7cqN-1712247413400)]

  • 数据库部分

[外链图片转存中…(img-dX43liT8-1712247413400)]

  • 流行的框架与新技术(Spring+SpringCloud+SpringCloudAlibaba)

[外链图片转存中…(img-jlapxu5e-1712247413400)]

这份面试文档当然不止这些内容,实际上像JVM、设计模式、ZK、MQ、数据结构等其他部分的面试内容均有涉及,因为文章篇幅,就不全部在这里阐述了。

作为一名程序员,阶段性的学习是必不可少的,而且需要保持一定的持续性,这次在这个阶段内,我对一些重点的知识点进行了系统的复习,一方面巩固了自己的基础,另一方面也提升了自己的知识广度和深度。
《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门即可获取!

  • 24
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值