XML的简介
XML:eXtensible Markup Language 可扩展标记语言 version=”1.0”
- 可扩展:所有的标签都是自定义的。
- 功能:数据存储
- 配置文件(例如:c3p0的配置文件后缀就是xml )
- 数据传输
html与xml区别:
- html语法松散,xml语法严格
- html做页面展示,xml做数据存储
- html所有标签都是预先定义好的,xml所有标签都是自定义的
xml语法
文档声明:
- 必须写在xml文档的第一行第一列。
- 写法:<?xml version="1.0" ?>
- 属性:
- version:版本号 固定值 1.0
- encoding:指定文档的码表。默认值为 iso-8859-1
- standalone:指定文档是否独立 yes 或 no,允不允许别人来约束你
元素:xml文档中的标签
- 文档中必须有且只能有一个根元素
- 元素需要正确闭合。
<student/> <name></name>
- 元素需要正确嵌套
- 元素名称要遵守:
- 元素名称区分大小写
- 数字不能开头
文本:转义部分
- 转义字符:<> 分别为@lt; @rt;其他的符号还有@等;
- CDATA: 里边的数据会原样显示:CDATA 部分由 "<![CDATA["
开始,由 "]]>"
结束:
- <![CDATA[ 数据内容 ]]>
属性:
- 属性值必须用引号引起来。单双引号都行
注释:
同HTML中的注释是一样的。
<!-- -->
xml约束:
定义:
约束就是xml的书写规则
约束的分类:
* dtd(约束力度不够,现在基本不使用):
* schema;
dtd约束:约束力度不够,现在基本不使用了
schema:
约束力度足够,不仅可以约束标签,还能够约束标签内容。
文档类型为xsd;
schema约束文件结构解析:
整个xsd文件如下:
<?xml version="1.0"?>
<xsd:schema xmlns="url"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
targetNamespace="url" elementFormDefault="qualified">
<xsd:element name="students" type="studentsType"/>
<xsd:complexType name="studentsType">
<xsd:sequence>
<xsd:element name="student" type="studentType" minOccurs="0" maxOccurs="unbounded"/>
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="studentType">
<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">
<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}"/>
</xsd:restriction>
</xsd:simpleType>
</xsd:schema>
结构解析:
1)名称空间:命名空间
xmlns:(xmlnamespace的简写),虽然可以随便写内容,但是一般写公司的url,其目的是赋予命名空间一个惟一的名称。不过,很多公司常常会作为指针来使用命名空间指向实际存在的网页,这个网页包含关于命名空间的信息。xmlns和targetNamespace的内容要一样。引用的时候就通过这个xmlns来引用
xmlns:xsd :实例名称空间,表示引用网络上的一个地址,这个地址是固定写法。
elementFormDefault为固定值,照着写就好了。
<xsd:schema xmlns="url"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
targetNamespace="url" elementFormDefault="qualified">
<xsd:element name="students" type="studentsType"/>
引用xsd文件的时候:
<students
xmlns="http://www.itcast.cn/xml"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.itcast.cn/xml student.xsd"
>
xmlns:就是xsd文件中的xmlns
xmlns:xsi:网络地址,固定值
xsi:先写xmlns地址,再写文件名字
2)
表示标签名约束标签名为students的约束。用studentsType的约束内容来约束;
complexType表示标签students下面可以有子标签;
sequence:表示序列,就是说上层标签students中可以有一个下面的子标签,在本利中是可以有子标签student和teacher。序列会有一定的顺序的,不能够擅自改变顺序。
minOccurs和MaxOccurrs分别表示这个标签的最小数量和最大数量。
<xsd:element name="students" type="studentsType"/>
<xsd:complexType name="studentsType">
<xsd:sequence>
<xsd:element name="student" type="studentType" minOccurs="0" maxOccurs="unbounded"/>
<xsd:element name="teacher" />
</xsd:sequence>
</xsd:complexType>
3)simpleType:简单类型,表明被约束的标签不能够有子标签
base :表示标签中标签体的数据类型。
enumeration:枚举类型
<xsd:simpleType name="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>
XML解析(重点)
解析xml的目的
- 读取xml中的数据
- 往xml中写入数据(几乎用不到),数据传入一般用json来传输
xml的解析思路(了解)
DOM:将文档加载进内存,形成一颗dom树(document对象),将文档的各个组成部分封装为一些对象。
- 优点:因为,在内存中会形成dom树,可以对dom树进行增删改查。
- 缺点:dom树非常占内存,解析速度慢。
SAX:逐行读取,基于事件驱动(里面有个读取器,边读边触发事件)
- 优点:不占内存,速度快
- 缺点:只能读取,不能回写,而且程序员使用不方便
常用的xml解析器
JAXP:sun公司提供的解析。支持dom和sax。(不常用)
JDOM(后来分裂了)
DOM4J(document for java 民间方式,但是是事实方式。非常好。 支持dom)
DOM4J解析xml
步骤:
- 1.导入jar包 dom4j.jar(遇到框架就导包)
- 2.创建解析器
SAXReader reader = new SAXReader(); - 3.解析xml 获得document对象
Document document = reader.read(url);
获取根节点Element root = documen.getRootElement()
-4.通过document对象的getRootElement方法找到根标签
Element rootElement = document.getRootElement();
然后可以通过两种方式找到根标签下面的子标签:
1)迭代器方法:elementIterator();
getName();获取标签名
getText();获取标签体内容
public void test01() throws Exception{
SAXReader reader = new SAXReader();
Document document = reader.read("src/com……/Book.xml");
Element rootElement = document.getRootElement();
//使用迭代器
// System.out.println(rootElement.getName());;
Iterator elementIterator = rootElement.elementIterator();
while(elementIterator.hasNext()){
Element element =(Element) elementIterator.next();
Iterator elementIterator2 = element.elementIterator();
while (elementIterator2.hasNext()) {
Element element2 = (Element) elementIterator2.next();
System.out.print(element2.getName()+":");
System.out.println(element2.getText());
}
System.out.println();
}
}
2)使用element和elements方法解析:
rootElement.elements();返回该标签下的所有子标签,返回值是一个list
rootElement.element(“标签名”);获取标签下指定的标签元素的第一个Element。
@Test
public void test02() throws Exception{
SAXReader saxReader = new SAXReader();
Document document = saxReader.read("src/com/……/Book.xml");
Element rootElement = document.getRootElement();
List<Element> elements = rootElement.elements();
for (Element element : elements) {
System.out.println(element.getName());
List<Element> elements2 = element.elements();
for (Element element2 : elements2) {
System.out.println(element2.getName()+":"+element2.getText());
}
System.out.println();
}
}
3)获取属性
标签名.attribute(“属性名”);返回的是一个Attribute的属性对象
再通过Attribute.getValue()方法获得这个属性的属性值
Attribute.getDat();也能够获取到属性的属性值。
@Test
public void test03() throws Exception{
SAXReader saxReader = new SAXReader();//获取saxReader解析器
Document document = saxReader.read("src/com/…/Book.xml");//读取xml文件,如src/com/itheima/xml/Book.xml
Element rootElement = document.getRootElement();//获得根标签
Element element = rootElement.element("书");
Attribute attribute = element.attribute("出版社");
System.out.println(attribute.getValue());;
}
XPATH(属于DOM4J中的,用于查询特定的节点)
导的包有两个,一个DOM4J的包,另外一个是Xpath的包jaxen-1.1-beta-6.jar
1)创建saxReader解析器
saxReader saxReader = new SaxReader();
2)读取xml文件,read方法
3)获取根标签。getRootElement();
- 使用的方法:
- selectSingleNode():
- selectNodes():
步骤:
- 1、注意:要导包 jaxen…jar
- 2、创建解析器
SAXReader reader = new SAXReader(); - 3、解析xml 获得document对象
Document document = reader.read(url);
1)获取符合路径的所有标签
SelectNodes("标签名或者标签层级");返回的是一个list
@Test
public void test04() throws Exception{
SAXReader saxReader = new SAXReader();//获取saxReader解析器
Document document = saxReader.read("src/com/……/Book.xml");//读取xml文件,如src/com/itheima/xml/Book.xml
Element rootElement = document.getRootElement();//获得根标签
List<Element> selectNodes = rootElement.selectNodes("书/书名");
for (Element element : selectNodes) {
System.out.println(element.getName()+":"+element.getText());
System.out.println();
}
}
2)selectSingleNode()获取单个节点标签
获取符合条件的第一个标签的相关内容。
要查看路径怎么写的,可以去资料中的index中看看