基础知识
XML是可扩展标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言, 它非常适合万维网传输,提供统一的方法来描述和交换独立于应用程序或供应商的结构化数据。是Internet环境中跨平台的、依赖于内容的技术,也是当今处理分布式结构信息的有效工具。
特点:
- 它的设计宗旨是传输数据,而不是显示数据;
- 它的标签没有被预定义,需要自行定义标签;
- 所有的标记必须成对出现,且必须保持严格的顺序。
[ 简要摘录源于百度 XML可扩展标记语言 ]
XML文件
一个简单的XML文件可分为如下几部分内容:文档声明 、元素、属性等等。
语法:
- 任何的起始标签都必须有一个结束标签。
- xml中必须有根元素是所有元素的父元素 。
- 可以采用另一种简化语法,可以在一个标签中同时表示起始和结束标签
- 所有的属性值必须加上双引号。
标签元素命名规则
1)名称可以含字母、数字以及其他的字符。
2)名称不能以数字或者标点符号开始。
3)名称不能以字符"xml"(或者XML、Xml)开始。
4)名称不能包含空格。
解析初步
XML文件中的标签可以看做节点Node,可以分为以下几类:
- Document 文档节点
- Element 元素节点
- 属性节点
- 文本节点
标签与标签之间存在“一对多”的关系,一对多的关系形成的是“树型”结构。
Node节点彼此都有等级关系。
名词解释DOM
DOM实际上是以面向对象方式描述的文档模型。DOM定义了表示和修改文档所需的对象、这些对象的行为和属性以及这些对象之间的关系。可以把DOM认为是页面上数据和结构的一个树形表示。
[ 摘录自 文档对象模型 ]
解析步骤
- 获取Document文档对象
- 根据XML文件的路径得到该文档资源
- 根据等级关系获取根元素、子元素、属性
xml文件
<?xml version="1.0" encoding="UTF-8"?> <!-- 文档声明 -->
<players> <!-- 根标签 -->
<player name = "sehun" age = "19">
<!-- 子标签 player ;属性 name、age -->
<hobbies>
<!-- 子标签 hobbies -->
<hobby>篮球</hobby>
<!-- 标签 文本内容 -->
<hobby>跑步</hobby>
<hobby>游泳</hobby>
<hobby>唱歌</hobby>
</hobbies>
</player>
<player name = "vivi" age = "20">
<hobbies>
<hobby>游泳</hobby>
<hobby>跑步</hobby>
</hobbies>
</player>
<player name = "demo" age = "18">
<hobbies>
<hobby>篮球</hobby>
<hobby>跑步</hobby>
<hobby>旅行</hobby>
</hobbies>
</player>
</players>
解析代码
package com.mec.parser.test;
import java.io.IOException;
import java.io.InputStream;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
public class TestForXML {
public static void main(String[] args) {
InputStream is = Class.class.getResourceAsStream("/test.xml");
try {
DocumentBuilder db = DocumentBuilderFactory.newInstance().newDocumentBuilder();
Document doc = db.parse(is);
NodeList sportList = doc.getElementsByTagName("player"); //取得指定的标签内容“player”
for(int i = 0;i < sportList.getLength();i++) {
Element player = (Element) sportList.item(i); //取得sportList的一个节点
String name = player.getAttribute("name"); //取得player标签的name属性值
String age = player.getAttribute("age"); //取得player标签的age属性值
System.out.println("姓名:" + name + " 年龄:" + age );
NodeList hobbyList = player.getElementsByTagName("hobby");
//取得指定的标签内容“hobby”
System.out.println(" 爱好:");
for(int j = 0;j < hobbyList.getLength();j++) {
Element hobby = (Element) hobbyList.item(j); //取得hobbyList的一个节点
String hobbyName = hobby.getTextContent(); //取得hobby标签的文本内容
System.out.print( " "+ hobbyName);
}
System.out.println();
}
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
运行结果如下:
姓名:sehun 年龄:19
爱好:
篮球 跑步 游泳 唱歌
姓名:vivi 年龄:20
爱好:
游泳 跑步
姓名:demo 年龄:18
爱好:
篮球 跑步 旅行