13.XML
XML概述
- 可扩展标记语言(XML),一种数据表示格式,常用于传输和存储数据
XML的几个特点和使用场景
- 纯文本,默认使用UTF-8编码,二是可嵌套
- 如果把XML内容存为文件,那么它就是一个XML文件
- 使用场景:XML内容经常被当成消息进行网络传输,或作为配置文件用于存储系统的信息
XML的创建、语法规则
XML的创建
- 创建一个XML类型的文件,后缀必须使用xml
IDEA创建XML文件的步骤
- 右键—>new—>File—>xxx.xml
XML的语法规则
-
文档声明必须是第一行

-
XML的标签(元素)规则
- 标签由一对尖括号和合法标识符组成:
,必须存在一个根标签,有且只能有一个 - 标签必须成对出现,有开始,有结束:
- 特殊的标签可以不成对,但是必须有结束标记,如:
- 标签中可以定义属性,属性和标签名空格隔开,属性值必须用引号引起来:
- 标签由一对尖括号和合法标识符组成:
-
XML的其他组成
- XML文件中可以定义注释信息:<!-注释内容-->
- 可以存在特殊字符:

- 可以存在CDATA区:<![CDATA[ ...内容... ]]
<?xml version="1.0" encoding="UTF-8" ?>
<!-- 注释:跟标签有且只有一个-->
<student>
<name>女儿国王</name>
<sex>女</sex>
<hobby>唐僧,追唐僧</hobby>
<info>
<age>30</age>
<addr>女儿国</addr>
</info>
<sql>
select * form user where age < 18;
<![CDATA[
select * form user where age < 18;
]]>
</sql>
</student>
XML文档约束方式一:DTD约束[了解]
- 文档约束:用来限定XML文件中的标签以及属性应该怎么写

<!ELEMENT 书架 (书+)>
<!ELEMENT 书 (书名,作者,售价)>
<!ELEMENT 书名 (#PCDATA)>
<!ELEMENT 作者 (#PCDATA)>
<!ELEMENT 售价 (#PCDATA)>
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE 书架 SYSTEM "data.dtd">
<书架>
<书>
<书名>精通javaSE</书名>
<作者>地雷</作者>
<售价>99</售价>
</书>
</书架>
- DTD缺点:不能约束具体的数据类型
XML文档约束方式二:schema约束[了解]
- 可以约束具体的数据类型
- 本身也是个xml文件,编写的更加严谨

XML解析
什么是XML解析?
- 使用程序读取XML中的数据
两种解析方式
- SAX解析
- DOM解析


Dom4J解析XML文件

Dom4J解析XML文件中的各种节点

public class Dom4jHelloWorldDemo1 {
@Test
public void parseXMLData() throws Exception {
// 1.创建一个Dom4j的解析器对象,代表了整个dom4j框架
SAXReader saxReader = new SAXReader();
// 2.把XML文件加载到内存中,成为一个document对象
//Document document = saxReader.read(new File("xml-app\\src\\d1_dom4j\\Contacts.xml")); // 需要通过模块名去定位
//Document document = saxReader.read(new FileInputStream("xml-app\\src\\d1_dom4j\\Contacts.xml"));
InputStream is = Dom4jHelloWorldDemo1.class.getResourceAsStream("Contacts.xml"); // 直接去src下寻找文件
Document document = saxReader.read(is);
// 3.获取根元素对象
Element root = document.getRootElement();
System.out.println(root.getName());
// 4.拿根元素下的全部子元素对象(一级)
List<Element> sonEles = root.elements();
for (Element sonEle : sonEles) {
System.out.println(sonEle.getName());
}
// 拿某个子元素
Element userEle = root.element("user");
System.out.println(userEle.getName());
// 默认提取第一个子元素对象
Element contact = root.element("contact");
// 获取子元素文本
System.out.println(contact.elementText("name"));
// 去掉前后空格
System.out.println(contact.elementTextTrim("name"));
// 根据元素获取属性值
Attribute idAttr = contact.attribute("id");
System.out.println(idAttr.getName() + "---" + idAttr.getValue());
// 直接提取属性值
System.out.println(contact.attributeValue("id"));
System.out.println(contact.attributeValue("vip"));
// 获取当前元素下的子元素对象
Element email = contact.element("email");
System.out.println(email.getText());
}
}
XML解析案例

注意:xml文件要放在src目录下,不然会报错
public class Dom4jTest2 {
@Test
public void parseToList() throws Exception {
// 需求:解析XML中的数据成为一个List集合对象
// 1.导入框架(完成)
// 2.创建SaxReader对象
SAXReader saxReader = new SAXReader();
// 3.加载XML文件成为document对象
InputStream is = Dom4jTest2.class.getResourceAsStream("/Contacts.xml");
Document document = saxReader.read(is);
// 4.先拿根元素
Element root = document.getRootElement();
// 5.提取contact子元素
List<Element> contactEles = root.elements("contact");
// 6.准备一个ArrayList集合封装联系人信息
List<Contact> contacts = new ArrayList<>();
// 7.遍历Contact子元素
for (Element contactEle : contactEles) {
// 8.每个子元素都是一个联系人对象,需要封装
Contact contact = new Contact();
contact.setId(Integer.valueOf(contactEle.attributeValue("id")));
contact.setVip(Boolean.valueOf(contactEle.attributeValue("vip")));
contact.setName(contactEle.elementTextTrim("name"));
contact.setGender(contactEle.elementTextTrim("gender").charAt(0));
contact.setEmail(contactEle.elementText("email"));
// 9.把联系人对象数据加入List集合
contacts.add(contact);
}
// 10.遍历List集合
for (Contact contact : contacts) {
System.out.println(contact);
}
}
}
Xpath检索技术
- XPath使用路径表达式来定位XML文档中的元素节点或属性节点


浙公网安备 33010602011771号