1、配置文件:在实际项目开发中,XML作为配置文件是不可取代的(框架中的部分功能可以以注解形式来取代)

  (1) 不同技术,XML配置文件的作用也不一样。

  (2) 比如当前和这个阶段的web.xml,就是用来做Servlet等相关组件配置中心的主配置文件来使用。

2、数据传输:数据传输的媒介

  (1) 、例如是A公司将他们的数据用JAva语言创建成XML文件,然后B公司用C#语言对XML文件进行解析,就可以得到A公司的保存在XML文件中的数据了。

  (2) 、我们未来的实际项目开发,前端和后端分工明确,后端(Java)连JDBC,将数据从数据库表中取出,然后将数据传输到前端(HTML),前端显示这些从数据库表中取出的数据。

  (3) 、综上:对于数据传输这方面,未来后端为前端做数据传输是经常用到的,我们使用数据传输的媒介来完成,但是在我们的实际项目开发中,我们有更好的方式来代替XML的形式做数据传输,我们用的是JSON。

3、基础语法:

  (1) 文档必须以<?xml开头,必须以?>结尾

  (2) 文档声明必须在文档中的0行0列

  (3) 文档声明的3个属性:

    version属性:指定xml文档版本,必须属性,因为我们不会选择1.1,只会选择1.0.

    encoding属性:指定当前文档的编码,可选属性,默认是utf-8;

    Standalone属性:指定文档独立性。可选属性,默认为yes,表示当前文档是独立文档,如果为no,则是非独立文档,会依赖外部文件。

  (4) 空元素的标签必须要自己闭合,不然整篇xml文档直接报废的。

  (5) 良好的xml文档,必须要有一个根元素  【有且仅有一个】

  (6) 注释: <!--   -->

  (7) 对于一些转义字符,我们要使用对应的替代

    <:对应小于号

    >:对应大于号

    &:对应&

    &apos:对应单引号

    ":对应双引号

  (8) CDATA区

    <![CDATA][xxxxxxxx中间的是我们本来是要用转义字符输出的,写在这里面就不用转义字符,可以直接输出了,不会出现冲突的xxxxxxx]]>

4、 xml文档解析:

  (1)、sax解析

  (2)、dom解析

  (3)、dom4j:实际开发中最常用的开发包:

5、必须使用核心类SaxReader加载xml文档获得Document,通过Document对象获得文档的根元素,然后就可以继续操作。

6、具体的操作步骤

  a.导入jar包

  b.创建一个核心对象 SAXReader     --------new SAXReader(); 

  c.将xml文档加载到内存中形成一棵树  --------------Document doc=reader.read(文件)

  d.获取根节点             ---------------------Element root=doc.getRootElement();

  e.通过根节点就可以获取其他节点(文本节点,属性节点, 元素节点)

    获取所有的子元素 -----------------List<Element> list=root.elements()

  f.element.elementText("id");  来得到子元素中的内容,通过子元素的节点名字来得到。

7、还有一个dom4j的扩充方法 xPath,可以直接通过xml文件中的单个标签路径来得到信息。

  事例:

  Element element_childer =  (Element)element_root.selectSingleNode("//body_01//childer_02");

下面是一个我用来实验的小示例:

  注意:要导入对应的开发包dom4j和jaxen包

import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List; import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
import org.xml.sax.SAXException; /**
* 这个是对xml的读、写进行的操作
* 使用的是dom4j这个jar来进行的操作
* 工具:jaxen-1.1-beta-6.jar dom4j-1.6.1.jar
* 读的时候使用了两种方法来进行读,具体需求看情况来定
* @author TurtleZhang
*
*/
public class ExerciseXMlDemo { public static void main(String[] args) throws IOException, SAXException, DocumentException {
//1----writer
writerXml(); //2----readere
readerXml_01(); //3----reader
readerXml_02(); //3---reader
readerXml_03();
} /**
* 模拟往文件中写入xml格式的内容
* 这个是自己创建好xml格式,填好数据,然后写入xml文件中
* @throws IOException
*/
private static void writerXml() throws IOException { //1----创建一个document文档,用来对xml进行操作写入
Document document = DocumentHelper.createDocument(); //2-----创建了一个根节点,推荐每个xml文档都有一个root,根节点
Element root = document.addElement("root"); //3------在root根节点下面创建了一个子节点
Element body_01 = root.addElement("body_01"); //4-------在第二层的子节点【元素】上添加所表示的文本信息
for(int i=0;i<5;i++) {
Element childer = body_01.addElement("childer_0"+i); childer.addText(Integer.toString(i));
} //3------重复上面的操作
Element body_02 = root.addElement("body_02"); //4-------重复上面的操作
for(int i=0;i<5;i++) {
Element childer = body_02.addElement("childer_0"+i);
childer.addText(Integer.toString(i));
} //5---进行文件的写入 ,创建写入文件流 FileOutputStream fileOutputStream = new FileOutputStream("test_01.xml"); //6---用一个好看的写入格式
OutputFormat outputFormat=OutputFormat.createPrettyPrint(); //6---创建,配置用来写入xml文件的xml文件写入流
XMLWriter xmlWriter=new XMLWriter(fileOutputStream,outputFormat); //7-----进行xml文件的写入
xmlWriter.write(document); //8-----写入完成,将文件进行关闭
xmlWriter.close(); } /**
* 第一种读取方式,也是传统的读取方式,通过循环来进行读取
* @throws SAXException
* @throws DocumentException
*/
@SuppressWarnings("unchecked")
private static void readerXml_01() throws SAXException, DocumentException { //1------创建一个用来读取的核心类
SAXReader saxReader=new SAXReader(); //2-------读取到对应的xml文档
Document document= saxReader.read("test_01.xml"); //3------通过xml文档来读取到根节点
Element element_Root= document.getRootElement();
System.out.println("根节点是"+element_Root.getName()); //4-----通过根节点来得到里面的子节点
List<Element> element_Bodys= element_Root.elements(); //下面的代码只是单纯的用来读取数据测试,没有任何实际作用的
//一般来说是配合xml文档的格式,我们会创建一个与之对应的类来进行数据的读取与保存
for(Element element : element_Bodys) { //5----得到节点的名字
String body=element.getName(); //6----得到节点的值
String childer_00=element.elementText("childer_00");
String childer_01=element.elementText("childer_01");
String childer_02=element.elementText("childer_02");
String childer_03=element.elementText("childer_03");
String childer_04=element.elementText("childer_04"); //7---通过StringBuilder来进行字符串的连接
StringBuilder stringBuilder=new StringBuilder(); stringBuilder.append("第一个子节点:");
stringBuilder.append(body);
stringBuilder.append("\t第一个元素值:");
stringBuilder.append(childer_00); stringBuilder.append("\t第二个元素值:");
stringBuilder.append(childer_01); stringBuilder.append("\t第三个元素值:");
stringBuilder.append(childer_02); stringBuilder.append("\t第四个元素值:");
stringBuilder.append(childer_03); stringBuilder.append("\t第无个元素值:");
stringBuilder.append(childer_04); System.out.println("我们读到的集合中的数据为:"+stringBuilder.toString());
}
} /**
* 小事例
* @throws DocumentException
*/
@SuppressWarnings("unchecked")
private static void readerXml_02() throws DocumentException { //1------创建一个用来读取的核心类
SAXReader saxReader=new SAXReader(); //2-------读取到对应的xml文档
Document document= saxReader.read("test_01.xml"); //3------通过xml文档来读取到根节点
Element element_Root= document.getRootElement();
System.out.println("根节点是"+element_Root.getName()); //4-----通过根节点来得到里面的子节点
List<Element> element_Bodys= element_Root.elements(); //将数据保存到Node类中,,也只是做个测试而已,具体的看需求而定
ArrayList<Node> nodes=new ArrayList<Node>(); for(Element e: element_Bodys) {
Node node=new Node(); node.setChilder_00(Integer.parseInt(e.elementText("childer_00")));
node.setChilder_01(Integer.parseInt(e.elementText("childer_01")));
node.setChilder_02(Integer.parseInt(e.elementText("childer_02")));
node.setChilder_03(Integer.parseInt(e.elementText("childer_03")));
node.setChilder_04(Integer.parseInt(e.elementText("childer_04"))); nodes.add(node);
}
for(Node n : nodes) {
System.out.println(n.toString());
}
} /**
* 第二种读取方式,通过对传统的dom4j的循环读取方式的扩充,是使用指定的标签来进行读取
* @throws DocumentException
*/
private static void readerXml_03() throws DocumentException { //1------创建一个用来读取的核心类
SAXReader reader=new SAXReader(); //2-------读取到对应的xml文档
Document document=reader.read("test_01.xml"); //3------通过xml文档来读取到根节点
Element element_Root= document.getRootElement(); //这个时候可以使用扩充功能,就直接使用标签名来进行 元素的取得 selectSingleNode 这个就是单独得到我们指定名字的标签
Element element = (Element)element_Root.selectSingleNode("//body_01//childer_02");
//输出测试
System.out.println("元素名:"+element.getName()+"\t\t元素值为:"+element.getText());
}
}

总结:在我们实际项目开发中:

  如果需求为解析出xml中所有的数据,那么我们使用传统的dom4j的形式来完成。

  如果需求为快速的找到xml中的某一个元素,那么我们使用xpath的形式来完成比较容易

  XML和JSON都可以完成不同系统之间数据交换。

  XML体积较大,解析难度较大,所以在现代开发中通常采用 JSON进行数据交换,因为JSON体积小,解析简单,而XML通常充当系统当中的配置文件

注意:

  1、xpath的形式是传统dom4j形式的扩充,不能独立存在

  2、xpath的使用必须导入jaxen-1.1-beta-6.jar包才能使用

  3、jaxen-1.1-beta-6.jar包必须依附于传统的dom4j的Jar包才能使用,不能独立存在。

XML--读写操作的更多相关文章

  1. 实现动态的XML文件读写操作

    实现动态的XML文件读写操作(依然带干货) 前言 最近由于项目需求,需要读写操作XML文件,并且存储的XML文件格式会随着导入的数据不同而随时改变(当然导入的数据还是有一定约束的),这样我们要预先定义 ...

  2. 实现动态的XML文件读写操作(依然带干货)

    前言 最近由于项目需求,需要读写操作XML文件,并且存储的XML文件格式会随着导入的数据不同而随时改变(当然导入的数据还是有一定约束的),这样我们要预先定义好XML文件的格式就不太现实了,如何实现不管 ...

  3. Java 对不同类型的数据文件的读写操作整合器[JSON,XML,CSV]-[经过设计模式改造](2020年寒假小目标03)

    日期:2020.01.16 博客期:125 星期四 我想说想要构造这样一个通用文件读写器确实不容易,嗯~以后会添加更多的文件类型,先来熟悉一下文件内容样式: <?xml version=&quo ...

  4. App.Config详解及读写操作

    App.Config详解及读写操作   App.Config详解 应用程序配置文件是标准的 XML 文件,XML 标记和属性是区分大小写的.它是可以按需要更改的,开发人员可以使用配置文件来更改设置,而 ...

  5. C# XML读写实例

    一.使用System.Xml 实例:完成如下格式配置文件的读写操作: <?xml version="1.0" encoding="UTF-8"?> ...

  6. 网站的配置文件XML读写

    网站的配置信息一般都写入到XML中,以下是简单的对xml的读写操作,仅供参考. 读操作: XmlDocument xmlDoc = new XmlDocument(); XmlReaderSettin ...

  7. android报错及解决2--Sdcard进行文件的读写操作报的异常

    报错描述: 对Sdcard进行文件的读写操作的时候,报java.io.FileNotFoundException: /sdcard/testsd.txt (Permission denied),在往S ...

  8. ios 简单的plist文件读写操作(Document和NSUserDefaults)

    最近遇到ios上文件读写操作的有关知识,记录下来,以便以后查阅,同时分享与大家. 一,简单介绍一下常用的plist文件. 全名是:Property List,属性列表文件,它是一种用来存储串行化后的对 ...

  9. UE4 Xml读写

    UE4自带一个XmlParser,可以很方便的实现Xml的读写. 1,在PublicDependencyModuleNames.AddRange中添加XmlParser. 2,include XmlP ...

  10. java封装实现Excel建表读写操作

    对 Excel 进行读写操作是生产环境下常见的业务,网上搜索的实现方式都是基于POI和JXL第三方框架,但都不是很全面.小编由于这两天刚好需要用到,于是就参考手写了一个封装操作工具,基本涵盖了Exce ...

随机推荐

  1. Chrome切换分辨率

    不知道大家是否有遇到在Web开发的时候,老大会让你模拟不同分辨率情况,这时候,可能就有些小小的麻烦,我们可能要不断调整分辨率.是件很崩溃的事情.现在推荐一款Chrome插件.即可实现这个简单的功能. ...

  2. [POI2004] SZP (贪心+拓扑排序)

    [问题描述] Byteotian 中央情报局(BIA) 雇佣了许多特工. 他们每个人的工作就是监视 另一名特工. Byteasar 国王需要进行一次秘密行动,所以他要挑选尽量多的信得过的特工. 但 是 ...

  3. HDU 1205 吃糖果 (数学)

    题目链接 Problem Description HOHO,终于从Speakless手上赢走了所有的糖果,是Gardon吃糖果时有个特殊的癖好,就是不喜欢将一样的糖果放在一起吃,喜欢先吃一种,下一次吃 ...

  4. ASP.NET 简单鼠标右键效果contextmenutrip

    <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx. ...

  5. javascript工厂模式、单例模式

    //工厂模式 function createObject(name,age){ var obj = new Object(); obj.name = name; obj.age = age; obj. ...

  6. Java线程总结(二)

    自定义线程的数据可以共享,也可以不共享,这要看具体的实现方式. 1.不共享数据多线程实现方式: public class MyThread extends Thread{ private int co ...

  7. Python代码这样写更优雅(转)

    1.变量交换 大部分编程语言中交换两个变量的值时,不得不引入一个临时变量: >>> a = 1>>> b = 2>>> tmp = a>&g ...

  8. clientX,offsetX,layerX,pageX,screenX,X鼠标位置全解

    clientX,offsetX,layerX,pageX,screenX,X有时容易记混,通过测试当前的主流浏览器疏理了自己的一些看法以供参考. Chrome下(测试版本为51.0.2704.106  ...

  9. linux编程之信号

    信号(signal)机制是UNIX系统中最为古老的进程之间的通信机制,它用在一个或多个进程之间传递异步信号,信号可以由各种异步事件产生,如: 键盘中断等等,在Linux 的shell 中,也可以使用信 ...

  10. Linux汇编教程01: 基本知识

    在我们开始学习Linux汇编之前,需要简单的了解一下计算机的体系结构.我们不需要特别深入的了解,理解了一些基本概念对与我们理解程序会很有帮助.现在计算机的结构体系都是采用冯诺依曼体系结构的基础上发展过 ...