Java 可扩展标记语言XML

可扩展标记语言,标准通用标记语言的子集,是一种用于标记电子文件使其具有结构性的标记语言。
1998年2月,W3C正式批准了可扩展标记语言的标准定义,可扩展标记语言可以对文档和数据进行结构化处理,从而能够在部门、客户和供应商之间进行交换,实现动态内容生成,企业集成和应用开发。可扩展标记语言可以使我们能够更准确地搜索内容,更方便地传输内容,更好地描述事物。
一、什么是可扩展标记语言?
可扩展标记语言是一种很像超文本标记语言的标记语言。
它的设计宗旨是传输数据,而不是显示数据。
它的标签没有被预定义。您需要自行定义标签。
它被设计为具有自我描述性。
它是W3C的推荐标准。
二、可扩展标记语言和超文本标记语言之间的差异
它不是超文本标记语言的替代。
它是对超文本标记语言的补充。
它和超文本标记语言为不同的目的而设计:
它被设计用来传输和存储数据,其焦点是数据的内容。
超文本标记语言被设计用来显示数据,其焦点是数据的外观。
超文本标记语言旨在显示信息;而XML旨在传输信息,它是独立于软件和硬件的信息传输工具。
三、可扩展标记语言是W3C的推荐标准
XML 于 1998 年 2 月 10 日成为 W3C 的推荐标准。


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

XML所谓的可扩展是相对于HTML来说的。
HTML(HyperText Markup Language)超文本标记语言。
HTML里定义了很多有特定含义的标记(标签)。
例如:
蓝鸥科技代表超链接

换行标签

一段话

HTML里每个标记(标签)都有特定的含义。这些含义会由浏览器识别, 并加以呈现和展示。

XML叫可扩展标记语言。
可扩展:XML给了我们一种语法格式,我们可以自己定义标签(标记)的
名称。

XML和HTML有什么异同?
XML关注的重心是内容本身。通过标签把内容包裹起来,主要用于数据的
存储以及传输(前后端收发信息)。
通常后台把数据组织成xml格式,把这个字符串发送给前段(html、ios、Android)
前段拿到数据之后,提取出里面的内容,用于程序展示信息。
也有时候,前段会把数据以xml格式传递给后端,后端拿到数据后,
进行提取,存入到文件或者存入到数据库。
前后端为了能更通畅的通信(数据的交互),需要为传递的数据定义格式
XML就是一种比较好的格式。在开发之前,前后台的开发人员会先讨论
如何定义和设计接口:传什么样的参数,传几个,返回什么样的结果。
结果往往是XML或者JSON格式。
HTMl更注重数据的展现,每个标签都有自己特定的格式(显示样式)

XML文件的后缀一般是.xml
HTML文件的后缀一般是.html .htm

XML语法格式:
在XML的首行,是XML的描述(声明)。一般包含版本号,编码格式。

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

标签:
标签用<>包裹,名字由程序员自己定。
标签分为开标签和关标签,必须成对出现。
开标签与关标签之间写内容或者子标签。

XML必须有且只有一个根标签(节点)。
根节点:没有父节点的节点。
每个节点(根节点除外)都有一个父节点。
每个节点可以有0到多个子节点。
没有子节点的节点称为叶子节点。叶子节点才是真正存放数据的节点
标签可以包含标签,但不能错位包含。


XML解析:
所谓XML解析,就是把想要的数据从XML中提取出来。
Java提供了2类XML解析方式:
DOM解析:
DOM(Document Object Model)文档对象模型。
这种解析方式,一次性读入整个XML文件(字符串)。将XML解析
为一个Document对象,Document对象是一个树,
Document对象里面存储了解析后的各个节点。
这些节点可以从Document提取出来。
SAX解析
Simple API for XML。这种解析方式无需读入整个XML文档,它
是基于事件的解析方式。即使XML文档里有些内容有误,它还是能
把出错之前的地方解析出来。

SAX解析,在将要开始解析的时候,调用startDocument方法。
程序员根据自己的需要,写相应的代码来实现自己的需求。
紧接着 会解析 根标签的开标签调用的是startElement如果想做什么
事,自己写代码。再然后调用 character方法,读取元素的文本内容,
同样是程序员自己写代码存储需要的数据。再之后,继续读子标签的
开标签startElement,再读character,再读endElement,
…以此类推。

程序员需要考虑的是:在什么时候创建对象(Student),在什么时候
给对象赋值(stu.setName(name)),再什么时候,把对象加入到List。

DOM解析:
你要获得Document对象。因为Document自身没有创建对象的
方法(它是一个接口),但是DocumentBuilder类提供了创建
Document的方法,因此我们需要先获得DocumentBuilder,
很不幸,DocumentBuilder是一个抽象类,也无法实例化。
庆幸的是DocumentBuilderFactory提供了方法获取DocumentBuilder
因此我们需要先创建DocumentBuilderFactory对象。

有了Document对象之后,就可以访问里面的元素了。
Document有一个方法叫getElementsByTagName(“标签名”)
得到的是NodeList(getLength(),item(index))
遍历NodeList可以获得所有的子节点,子节点里有空白节点
要去除空白节点。通过判断Node的类型可以去除,
if(node.getNodeType() == Node.ELEMENT_NODE)
一旦确定一个node是元素节点,可以获取元素的内容
node.getTextContent()。//注意的是,如果元素不是叶子元素
将获得所有子元素的文本内容。

如果某个元素包含属性,我们可以通过getAttributes()获取该
元素的所有属性(NamedNodeMap)。
想要获取单个属性对象:方法一: map.getNamedItem(“属性名”);
方法二:map.item(下标)
如何获取属性的值 属性.getNodeValue()

DOM解析XML的特点是:一次读入一个完整的XML文档。
因此它的效率很高,因为已经转化成了一个树,存储在了Document里。
但是它存储的类型和我们想要的类型不一样。
我们想要Student对象,但是 它存的是一个个节点。因此需要我们
写代码进行提出元素的内容,放到我们自己创建的对象里。
DOM解析的缺点:消耗内存大,因为一次读入整个XML文档,XML文档越大
消耗内存就越大。如果一个XML文件过大,导致你创建Document失败(内存不足)

SAX解析XML的特点:一次读入一行信息。
读入信息的时候会触发事件(开始文档、开始标签、开始内容、结束标签、结束文档等)
至于事件发生后,做什么事程序员写。
SAX的优点:内存占用少,一次只读1行。速度快。所以无论xml有多大,都可以用它
缺点:解析过程需要程序员自己编写。


总结xml
XML-可扩展标记语言
1、扩展名是.xml
2、内部有很多自定义标签
3、注释<!== 注释内容 ==>
4、<?xml version="1.0" encoding="UTF-8" ?>
5、每一个标签都有开标签和关标签
6、标签不能错位嵌套
7、只有一个根节点
8、每个节点都有一个父节点(根节点除外)
9、每个节点都有0-多个子节点。

XML一般有2种用途
1、配置文件是XML格式的
2、前后台交互通过XML格式的字符串进行交互。(需要前后台约定好标签名都是啥)

XML解析有2种
DOM:读入整个XML,解析成Document文档,Document里包含了Node、Attr等信息。这些类型一定与我们想要的类型不一致。Ticket、Order,需要我们自己从Document中提取信息,封装到我们自己的类中。
DOM的优点:解析简单。缺点:占内存多。

SAX:一次读入一行XML,基于事件的处理机制。分为开始解析文档,开始解析标签,读到内容,结束解析标签,结束解析文档。
SAX解析的优点:省内存,缺点:需要自己控制解析过程。

DOM的代码实现

第一步:
要创建Document
但是Document是一个接口,没有办法创建对象。我们说的创建对象,指的是创建接口的实现类对象。
通过DocumentBuilder获取Document对象。
但是DcoumentBuilder是抽象类,不能创建对象。
DocumentBuilderFactory类可以帮你获得DocumentBuilder对象。

DoucmentBuilderFactory dbf = DocumentBuilderFactory.newInstance();

DocumentBuilder db = dbf.newInstance();
Document doc = db.parse(“src\students.xml”);//解析完成,结果放在了doc里。

NodeList list = doc.getElementsByTagName(“Student”);
for(int i = 0; i < list.getLength(); i++){
Node student= list.item(i);
Attribute id = student.attributes().getNameItem(“id”);
String idStr = id.getNodeValue();

NodeList children = student.childNodes();
Node name = children.item(0);
String str = name.getTextContent();//获取节点的文本内容,如果不是叶子节点,会把子节点的内容一起得到。

}

SAX解析:
SAXParserFactory spf = SAXParserFactory.newInstance();
SAXParer sp = spf.newInstance();

Handler hd = new Handler();
sp.parse(“src\students.xml”,hd);

public class Handler extends DefaultHandler{

startDocument
endDocument
startElement
endElement
character

}

我不爱使用DOM解析?
因为占内存多,解析不了大文件。
而且从doc中提取信息的时候也麻烦。
我也不在用SAX解析?
因为要自己写解析过程。

dom4j可以解决你的烦恼。
dom4j是第三方提供的jar包。
dom4j的一个组织,它编写的DOM4j框架。而且是市面上最优秀的XML解析框架。性能非常好,超越原生的解析以及各大公司提供的解析框架。
使用起来也非常方便。

使用dom4j的步骤:
1、导包
2、使用
SAXReader reader = new SAXReader();
Document doc = reader.read(new File(“路径”));
3、先获取rootElement
Element root = doc.getRootElement();

List list1 = root.elements();//获取root的所有子节点
List list2 = root.elements(“student”);//获取root下所有叫student的节点。
Element ele = root.element(“student”);//获取root下叫student的单个元素
Attribute att = ele.attribute(“id”);//获取ele中名为id的属性。
String id = att.getText();//读取属性的值
String value = ele.getText();//读取元素的值。

猜你喜欢

转载自blog.csdn.net/weixin_43791238/article/details/88980201