xml

xml是一种可拓展标记语言,是w3c组织发布的。可拓展就是标签可以自己定义。xml两个版本1.1版本不能向下兼容,1.0使用较多。
xml由软件解析,用户编写(按照说明文档),说明文档有软件开发者提供。

  • xml与html区别

    1. xml标签都是自定义的,html标签是预定义。

    2. xml的语法严格,html语法松散

    3. xml是存储数据的,html是展示数据

  • xml应用

    • 用于不用系统之间的数据传输
    • 用来表示生活中有关系的数据
    • 用作配置文件

xml语法

文件后缀名为.xml, 首行文档声明(xml版本号,xml字符编码…)。 属性值必须使用引号引起来

文档声明

1
2
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<!-- standalone:是否依赖其他文件, no表示依赖 -->

PI指令

引入css文件,该文件的样式只对英文标签起作用,对xml中文标签不起作用

1
<?xml-stylesheet type="text/css" href="a.css" ?>	<!--引入css样式>

标签: 自定义

  • xml区分大小写
  • xml标签不能以数字和下划线开头,不能以xml开头,标签中不能有空格,冒号
  • 标签可以嵌套若干子标签,但不允许交叉嵌套
  • xml会把空格和换行都当成内容来解析
1
2
包含标签主题:<tmp></tmp>
不含标签主题:</tmp>

属性

1
<tmp id="1" class="tmp"></tmp>

文本

普通标签中的文本不能使用特殊字符,需要转义。CDATA区中的数据会被原样展示。

1
2
3
<![CDATA[ 
数据
]]>

特殊字符

特殊字符 < > &
替代符号 &lt; &gt; &amp; &apos; &quot;

dtd约束

  • 有几个xml元素就定义几个<ELEMENT>标签

  • 复杂元素(有子元素的元素), 约束元素中包含的子元素

    • <!ELEMENT 元素名称 (子元素,子元素)>
  • 简单元素, 约束元素为字符类型

    • <!ELEMENT 元素名称 (#PCDATA)>
  • 约束元素的属性

    • <!ELEMENT 元素名称 属性名 属性类型

练习

1
2
3
4
5
6
<!ELEMENT students (student*) >				<!-- students标签下可以有任意个student标签 -->
<!ELEMENT student (name,age,sex)> <!-- student标签下只能由name,age,sex标签 -->
<!ELEMENT name (#PCDATA)> <!-- name标签为简单元素: 不能由子元素 -->
<!ELEMENT age (#PCDATA)>
<!ELEMENT sex (#PCDATA)>
<!ATTLIST student number ID #REQUIRED> <!-- student有number属性, 属性值唯一,且必须有-->

dtd三种引入方式

1
2
3
4
5
6
7
8
9
10
<!-- 1. xml文件中直接编写(内部dtd) -->
<!DOCTYPE 根元素名称 [
dad约束
]>

<!-- 2. 引用外部dtd文件 -->
<DOCTYPE 根元素(标签)名称 SYSTEM "dtd文件路径">

<!-- 3. 引用网络上的dtd文件 -->
<!DOCTYPE 根元素名称 PUBLIC "dtd文件名称" "dtd文件URL">

Schema约束

文件名*.xsd, 是一种复杂约束

引入

  1. 填写xml文档的根元素
  2. 引入xsi前缀.
    • xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. 引入xsd文件命名空间
    • xsi:schemaLocation="http://www.ttt.cn/xml student.xsd"
  4. 为每一个xsd约束声明一个前缀,作为标识
    • xmlns="http://www.ttt.cn/xml"

例如

1
2
3
<students   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.ttt.cn/xml"
xsi:schemaLocation="http://www.ttt.cn/xml student.xsd">

操作xml

  1. 解析(读取):将文档中的数据读取到内存中
  2. 写入:将内存中的数据保存到xml文档中。持久化的存储

解析xml的方式

服务器采用dom的思想,移动端采用SAX思想

  1. DOM:将标记语言文档一次性加载进内存,在内存中形成一颗dom树

    • 优点:操作方便,可以对文档进行CRUD(增删改查)的所有操作

    • 缺点:占内存

  2. SAX:逐行读取,基于事件驱动的。

    • 优点:不占内存。

    • 缺点:只能读取,不能增删改

xml常见的解析器

  1. JAXP:sun公司提供的解析器,支持dom和sax两种思想, 使用较少。
  2. DOM4J:一款非常优秀的解析器, 服务器端使用多
  3. Jsoup:jsoup 是一款Java 的HTML解析器,可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API,可通过DOM,CSS以及类似于jQuery的操作方法来取出和操作数据。
  4. PULL:Android操作系统内置的解析器,sax方式的。

Jsoup解析器

对象使用

  1. Jsoup:工具类,可以解析html或xml文档,返回Document

    • parse方法:解析html或xml文档,返回Document
      • parse(File in, String charsetName):解析xml或html文件的。
      • parse(String html):解析xml或html字符串
      • parse(URL url, int timeoutMillis):通过网络路径获取指定的html或xml的文档对象
  2. Document:文档对象。代表内存中的dom树,Document对象继承了Element对象

    • 获取Element对象
      • getElementById(String id):根据id属性值获取唯一的element对象
      • getElementsByTag(String tagName):根据标签名称获取元素对象集合
      • getElementsByAttribute(String key):根据属性名称获取元素对象集合
      • getElementsByAttributeValue(String key, String value):根据对应的属性名和属性值获取元素对象集合
  3. Element:元素对象

  4. Elements:元素Element对象的集合。可以当做ArrayList<Element>来使用

    1. 获取子元素对象

      • getElementById(String id):根据id属性值获取唯一的element对象
      • getElementsByTag(String tagName):根据标签名称获取元素对象集合
      • getElementsByAttribute(String key):根据属性名称获取元素对象集合
      • getElementsByAttributeValue(String key, String value):根据属性名和值, …
    2. 获取属性值

      • String attr(String key):根据属性名称获取属性值, 不区分属性名的大小写
    3. 获取文本内容

      • String text(): 获取文本内容(不包括子标签的标签体)
      • String html(): 获取标签体的所有内容(包括子标签的标签体)
  5. Node:节点对象

    • 是Element, Document的父类

步骤:

  1. 导入jar包
  2. 获取Document对象
  3. 获取对应的标签Element对象
  4. 获取数据

练习

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// 获取xml文件的Document对象
String path = jsoup.class.getClassLoader().getResource("xml/dtd/student.xml").getPath();
Document document = Jsoup.parse(new File(path), "utf-8");

// 获取带有number属性的元素
Elements number = document.getElementsByAttribute("number");
System.out.println(number);
System.out.println("-----------------------");
System.out.println(number.get(0).text());
System.out.println("-----------------------");

// 获取带有number属性的元素下的age标签
Elements age = number.get(0).getElementsByTag("age");
System.out.println(age.get(0).text());

快速选择标签

  1. selector:选择器

    • 使用的Element对象中的方法:Elements select(String cssQuery)

    • 语法:参考Selector类中定义的语法

  2. XPath:XPath即为XML路径语言

  3. 导入JsoupXpath.jar包。

    1. 获取JXDocument对象
      • JXDocument jxDocument = new JXDocument(document);
  4. 选择标签

    • 使用JXDocument对象中的sel, selN, selOne, selNOne方法
  5. 例子: 选择student小的age标签

1
2
3
4
5
6
7
8
9
10
11
12
// 获取xml文件的Document对象
String path = jsoup.class.getClassLoader().getResource("xml/dtd/student.xml").getPath();
Document document = Jsoup.parse(new File(path), "utf-8");

// 使用 Selector 选择
Elements elements = document.select("student>age");
System.out.println(elements.text());

// 使用 Xpath 选择
JXDocument jxDocument = new JXDocument(document);
List<JXNode> jxNodes = jxDocument.selN("//student/age");
System.out.println(jxNodes);

 

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×