XML基础语法
和html超文本语言一样,只不过xml主要作用是存储数据,和配置文件作用
xml创建
<?xml version="1.0" encoding="UTF-8" ?> //必写,定义xml版本和编码格式
<!DOCTYPE students SYSTEM "student.dtd">//约束的一种(这是dtd约束),还有一种是schema约束
<students>
<student number="s0001">
<name>zs</name>
<age>abc</age>
<sex>yao</sex>
</student>
</students>
DTD约束
DTD语法简单,但是约束力不强,如性别只能男和女这些不能约束
<!ELEMENT students (student*) > //开头第一个定义根元素,唯一!
<!ELEMENT student (name,age,sex)>//students的子元素,其中student下有name,age,sex子标签
<!ELEMENT name (#PCDATA)>
<!ELEMENT age (#PCDATA)>
<!ELEMENT sex (#PCDATA)>
<!ATTLIST student number ID #REQUIRED> //创建属性number在student中,并且必需,和不能重复!
schema约束
schema语法难,约束力强大,在框架的配置中经常用到
<?xml version="1.0"?>
<xsd:schema xmlns="http://www.itcast.cn/xml" //命名空间 xml在引用约束的地址,随便写,不过一般用网址名称
xmlns:xsd="http://www.w3.org/2001/XMLSchema" //名称空间 有了命名空间可以直接使用<xsd XXX>来使用不同schema约束文件的,简化格式。
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"//引入shema约束,名称空间 实际地址
<xsd:element name="students" type="studentsType"/> //定义元素,type就当是id的意思
<xsd:complexType name="studentsType"> //给type叫studentsType的标签进行描述
<xsd:sequence> //序列,标签顺序
<xsd:element name="student" type="studentType" minOccurs="0" maxOccurs="unbounded"/>//最小0,最大无界
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="studentType"> //给type叫studentsType的标签进行描述
<xsd:sequence>
<xsd:element name="name" type="xsd:string"/> //字符串类型
<xsd:element name="age" type="ageType" />
<xsd:element name="sex" type="sexType" />
</xsd:sequence>
<xsd:attribute name="number" type="numberType" use="required"/>
</xsd:complexType>
<xsd:simpleType name="sexType"> //给type叫sexType的标签进行描述
<xsd:restriction base="xsd:string"> //限制文本输入
<xsd:enumeration value="male"/> //男
<xsd:enumeration value="female"/> //女
</xsd:restriction>
</xsd:simpleType>
<xsd:simpleType name="ageType">
<xsd:restriction base="xsd:integer">
<xsd:minInclusive value="0"/> //最小
<xsd:maxInclusive value="256"/> //最大
</xsd:restriction>
</xsd:simpleType>
<xsd:simpleType name="numberType">
<xsd:restriction base="xsd:string">
<xsd:pattern value="itcast_\d{4}"/> //正则:必需是itcast_4个数字格式
</xsd:restriction>
</xsd:simpleType>
</xsd:schema>
xmlns:XXX 名称空间
标签<XXX:name>使用XXX约束的name元素(可以把XXX取消掉,直接用<name>元素,如果约束过多,还是带上<XXX:name>)
xsi:schemaLocation 引用schema地址,格式 名称空间 空格 命名空间(本地或者网络)
XML解析
无非是读,写
DOM:将文档加载内存,形成一颗dom树,将文档的各个组成部分封装成对象
优点:在内存形成dom树,可以对dom进行增删改查
缺点:dom占内存,过大xml速度会慢
Document
Element
Text
Attribute
Comment
SAX:逐行读取,基于事件驱动
优点:不占内存,速度快
缺点:只能读取,不能回写
startDocument
startElement
characters
endElement
endDocument
XML常用的解析器:
JAXP:sun公司提供的,支持dom和sax(sun公司自己都不用···)
JDOM:创建后分家,就出现底下那个
DOM4J:dom for java民间方式,非常好。支持dom
1.导入jar包dom4j.jar
2.创建解析器
SAXReader reader =new SAXReader();
3.解析xml获取document对象
Document document=reader.read(url);
DOM4j:
dom4j教程看:https://dom4j.github.io/(简单哦了)
public Document parse(URL url) throws DocumentException {
SAXReader reader = new SAXReader();
Document document = reader.read(url);//把xml加载dom到内存中
return document;//返回document对象
}
public void bar(Document document) throws DocumentException {
Element root = document.getRootElement();//获得根节点
// iterate through child elements of root 遍历root的子节点
for (Iterator<Element> it = root.elementIterator(); it.hasNext();) { //这种写法我挺支持的Iterator写在里面,用完就销毁。是个好技巧
Element element = it.next();
// do something
}
// iterate through child elements of root with element name "foo"
for (Iterator<Element> it = root.elementIterator("foo"); it.hasNext();) {
Element foo = it.next();
// do something
}
// iterate through attributes of root
for (Iterator<ttribute> it = root.attributeIterator(); it.hasNext();) {
Attribute attribute = it.next(); //获得属性
// do something
}
}
public void treeWalk(Element element) {//递归xml遍历出所有的元素
System.out.println(element.getName);
for (int i = 0, i<element.nodeCount();i++) {
Node node = element.node(i);
if (node instanceof Element) {//判断是否是Element,是就递归,继续遍历元素里面的元素
treeWalk((Element) node);
}
}
}
1.引入jaxen-1.1.6.jar
2.document.方法:
selectSingleNode("/书架/书[1]/书名") //寻找元素带书架下的第一个书元素的书名元素
selectNodes("//*") //遍历所有的标签,比dom4j的递归遍历简单多了
//为根目录下并且忽略深度,*代表所有元素
//@id 忽略深度匹配属性<bbb id="b1"/>
//BBB[@id] 忽略深度匹配BBB元素带id属性的元素
//BBB[not(@*)] 忽略深度匹配BBB元素不带属性的元素