每日心得
今天上午就讲了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编程语言之外的,xml
比java
更早出现,java只是有使用xml的api;
优点:使用同的规范,每个语言中可以写一个API
,用了使用xml
语法,拥有xml
的解析和生成的功能,不用开发人员自己写,可读性很强;
缺点:字符量太大,体量太大,xml
就失去了优势,体量小可以使用,其功能逐渐被其他东西替代。
webservice
,XMPP
,基于xml
的传输协议
最开始xml是用来做网页数据传输,-->json
-->html
替代
现在也可以做配置文件-->也被注解Annotation
,properties
,yml
替代;
名词概念
(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.XML
与HIML
的主要差异
●XML
不是HTML
的替代。
●XML
和HML
为不同的目的而设计。
●XML
被设计为传输和存储数据,其焦点是数据的内容。
●HTML
被设计用来显示数据,其焦点是数据的外观。
●HTML
旨在显示信息,而XML
旨在传输信息。
3.XML
用于创建新的 Intermet
语言
●XHTML
-最新的HML版本4
●WSDL
-用于描述可用的web service
●WPL
和WML
-用于手持设备的标记语言
●RSS
-用于 RSS
feed
的语言
●RDF
和OWL
-用于描述资源和本体
●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
"(或者XML
、Xml
)开始
名称不能包含空格
可使用任何名称,没有保留的字词。
●所有的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
:通常通过流的方式逐步解析,。