XML 2021.1.7

每日心得

今天上午就讲了xml,下午搞了oracle的安装,本来打算将的,但安装时间费了很久,所以今天只讲了xml;

XML

网络资料:https://bk.tw.lvfukeji.com/baike-可扩展消息与存在协议?wprov=srpw1_0(可扩展消息与存在协议XMPP)

https://bk.tw.lvfukeji.com/wiki/W3CW3C(W3C,万维网联盟,北京航空航天大学为W3C中国机构)

推荐标准:CSS,HTML,XML等等;

extensible markup language(可扩展标记语言)

html hyper text markup language(超文本标记语言),组织发布-->浏览器升级去支持语言

ObjectInput.readObject(Command);-->java Object

ObjectOutput.writerObject(Command);-->java Object

采用方式进行数据交互限制太多,只能用Java,类型也是Object,但项目开发中将会有多种语言,多种不同的设备,安卓,java,IOS,Linux C等等;

跨语言数据交互

字符串传输可以跨语言(只要采用同样的编码集,就可以跨语言),但没有规范,语言不同或者开发的人不同,对语言理解不同,其字符串使用的格式可能不同,所以这时候有了XML对字符串进行格式化;

ml-->标记语言,x-->可扩展,为了可变化,xml是与java同一级别的,也是一种语言,是一种标记语言,是独立在java编程语言之外的,xmljava更早出现,java只是有使用xml的api;

优点:使用同的规范,每个语言中可以写一个API,用了使用xml语法,拥有xml的解析和生成的功能,不用开发人员自己写,可读性很强;

缺点:字符量太大,体量太大,xml就失去了优势,体量小可以使用,其功能逐渐被其他东西替代。

webserviceXMPP,基于xml的传输协议

最开始xml是用来做网页数据传输,-->json

-->html替代

现在也可以做配置文件-->也被注解Annotationpropertiesyml替代;

名词概念

(1)XML说明

一个开始标签到一个结束标签是一个元素,元素里面可以包括元素,元素值必须加引号

struts-->dtd

dtd文件:对xml内容的规范与验证,对一个xml文件的属性,格式,各种进行规范的定义

限制xml的内容,但没法进行精准控制,但语法较为简单;

spring-->xsd

xsd,语法规则较为复杂,可以精准控制其内容与格式;

XML解析

含义:将xml文件读取到java的内存里面,并且将你想要的那一部分信息截取出来;

DOM解析:一次将xml读入到内存,形成一个xml树形结构;解析-->遍历这个树形结构;(文件不能太大,不然太占内存,程序会卡死)

spring-->dom解析

SAX解析:分布解析,逐步读取xml的标签,基于事件驱动的方式读取整个xml内容,因为是一个标签一个标签往后读,所以不怎么占内存,但是只能往后读,不能回退,要读最后一个节点,只能把前面读完,要读前面的,必须重写读;

一般使用的都是DOM,因为xml文件一般不大,所以大部分情况DOM已经能够满足需求;除非对性能要求极高,需要反复不停地解析xml,例如使用XMPP写及时通讯,需要不停解析xml,才会出问题;而java中,xml作为配置文件,就只有一个,在启动时读完就行了。

students.xml

<?xml version="1.0" encoding="UTF-8"?>
<students>
	<studuent>
		<name>aaaa</name>
		<age>11</age>
		<gender>true</gender>
	</studuent>
		<studuent>
		<name>bbbb</name>
		<age>22</age>
		<gender>false</gender>
	</studuent>
		<studuent>
		<name>cccc</name>
		<age>33</age>
		<gender>true</gender>
	</studuent>
</students>

Student

package qifanclass.xml;

public class Student {

	private String name;
	private int age;
	private boolean gender;
	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 boolean isGender() {
		return gender;
	}
	public void setGender(boolean gender) {
		this.gender = gender;
	}
	@Override
	public String toString() {
		return "Student [name=" + name + ", age=" + age + ", gender=" + gender + "]";
	}
	
}

DomTest

package qifanclass.xml;

import java.io.File;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;


public class DomTest {

	public static void main(String[] args) throws Exception{
		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();//构建解析的工厂
		
		DocumentBuilder documentBuider = factory.newDocumentBuilder();//构造解析器
		
		File xml = new File("src/qifanclass/xml/students.xml");//传入xml文件
		Document doc = documentBuider.parse(xml);//这时会将整个xml文件读入到内存中,并且将解析构建成一个Document
												//这个Document文档就是对于整个xml节点数的一个引用,你就可以通过整个对象去获取xml的根节点,根节点再去获取它的子元素,通过子元素再去获取子元素的内容,分步来读取里面的内容
		Element element = doc.getDocumentElement();//获取整个文档的根节点
		//System.out.println(element);结果:[students: null]
		NodeList childNodes = element.getChildNodes();//通过根节点获取子节点
		//System.out.println(childNodes.getLength());结果为7,这里需要注意,除了看到的3个子节点以外,每个子节点的每一个前或后空白也算一个节点,也就是四个空白节点,就是7个节点
		
		for(int i=0;i<childNodes.getLength();i++){//遍历
			Node node = childNodes.item(i);//获取某一个节点
			/*System.out.println(node);这里也输出了空白节点
			结果:
			 		[#text: 
							]
					[studuent: null]
					[#text: 
							]
					[studuent: null]
					[#text: 
							]
					[studuent: null]
					[#text: 
					]*/
			if(node instanceof Element){//判断是不是一个元素,省去空白
				Element ele =(Element)node;//转换为一个元素
				//ele.getAttribute("");获取属性
				//ele.getAttributes();获取所以属性
				/*System.out.println(ele.getNodeName());
				获取节点名字结果
				studuent 
				studuent
				studuent*/
				Student stu = new Student();
				NodeList names = ele.getElementsByTagName("name");//每一个student里有几个name
				//System.out.println(name.getLength());结果为1 1 1
				Element nameElement = (Element)names.item(0);//获取name元素
				Element ageElement = (Element)ele.getElementsByTagName("age").item(0);//获取age元素
				Element genderElement = (Element)ele.getElementsByTagName("gender").item(0);//获取gender元素
				String name= nameElement.getTextContent();//获取元素中的文本(值)
				String age = ageElement.getTextContent();
				String gender =genderElement.getTextContent();
				System.out.println("name:"+name+",age:"+age+",gender:"+gender);
				/*结果为
				name:aaaa,age:11,gender:true
				name:bbbb,age:22,gender:false
				name:cccc,age:33,gender:true
				 */
			}
		}
	}
}

部分说明:

XML
1.什么是XML
XML指可扩展标记语言(EXtensible Markup language)
XML是一种标记语言,很类似HIML
XML的设计宗旨是传输数据,而非显示数据
XML标签没有被预定义。您需要自行定义标签。
XML被设计为具有自我描述性,
XML是W3C的推荐标准

2.XMLHIML的主要差异
XML不是HTML的替代。
XMLHML为不同的目的而设计。
XML被设计为传输和存储数据,其焦点是数据的内容。
HTML被设计用来显示数据,其焦点是数据的外观。
HTML旨在显示信息,而XML旨在传输信息。

3.XML用于创建新的 Intermet语言
XHTML-最新的HML版本4
WSDL-用于描述可用的web service
WPLWML-用于手持设备的标记语言
RSS-用于 RSS feed的语言
RDFOWL-用于描述资源和本体
SMIL-用于描述针对web的多媒体

4.名词概念
XML说明
<?xml version-"1.0"encoding-"utf-8"?>
●标记(标签)Tag
标记(标签)是左尖括号(<)和右尖括号(>)之间的文本。有开始标记(例如
<speciality>)和结東标记(例如:</speciality>)
XML元素 Element
XML元素指的是从(且包括)开始标签直到(且包括)结束标签的部分。
元素可包含其他元素、文本或者两者的混合物。元素也可以拥有属性。
<a>aaaaaa <a><a1>bbbb<a1>/a> <a><a href=""/>
XML属性
属性( Attribute)提供关于元素的额外(附加)信息。
XML属性必须加引号(单引号,或者双引号)。

避免XML属性?
因使用属性面引起的一些问题:
属性无法包含多重的值(元素可以)
属性无法描述树结构(元素可以)
属性不易扩展(为未来的变化)←
属性难以阅读和维护
请尽量使用元素来描述数据。而仅仅使用属性来提供与数据无关的信息。
Eg:

<note day="08"month=08"year="2008"/
to="George"from"John"heading="Reminder"
body="Don't forget the meeting!">
</note>

5.语法规则
XML命名规则
XML元素必须遵循以下命名规则
名称可以含字母、数字以及其他的字符
名称不能以数字或者标点符号开始
名称不能以字符“xml"(或者XMLXml)开始
名称不能包含空格
可使用任何名称,没有保留的字词。
●所有的XML元素都必须有关闭标签
注:XML声明没有关闭标签,这不是错误,声明不属于XML本身的组成部分,它不是XML元素,也不需要关闭标签,
XML标签对大小写敏感
XML必须正确地嵌套,不能交叉嵌套4
XML文档必须有根元素
注:XML文档必须有一个元素是所有其他元素的父元素。该元素称为根元素,
XML的属性值须加引号
●实体引用
< < 小于
> > 大于
& & 和号
' ' 单引号
" " 双引号
XML中的注释
<!-- -->
●在XML中,空格会被保图
CDATA
<![CDATA[ ]]>//中间可放xml语句,识别为字符串
6.验证
拥有正确语法的XML被称为“形式良好”的XML
通过DTD/ SCHEMA验证的XML是“合法”的XML
7.xml解析
DOM:将整个xml,一次性解析后,在内存中生成DOM树。
SAX:通常通过流的方式逐步解析,。

原文地址:https://www.cnblogs.com/zzdbk/p/14248034.html