XML相关知识
XML:eXtensible Markup Language 可扩展标记语言 version="1.0"
* 可扩展:所有的标签都是自定义的。
* 功能:数据存储
* 配置文件
* 数据传输
* 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文档中的标签
** 文档中必须有且只能有一个根元素
* 元素需要正确闭合。<body></body> <br/>
* 元素需要正确嵌套
* 元素名称要遵守:
* 元素名称区分大小写
* 数字不能开头
* 文本:
* 转义字符:>
* CDATA: 里边的数据会原样显示
* <![CDATA[ 数据内容 ]]>
* 属性:
* 属性值必须用引号引起来。单双引号都行
* 注释:
<!-- -->
<?xml-stylesheet type="text/css" href="1.css"?>
XML解析:
* 解析xml可以做:
* 如果xml作为配置文件:读取
* 如果xml作为传输文件:写,读
* xml解析思想:
* DOM:将文档加载进内存,形成一颗dom树(document对象),将文档的各个组成部分封装为一些对象。
* 优点:因为,在内存中会形成dom树,可以对dom树进行增删改查。
* 缺点:dom树非常占内存,解析速度慢。
Document
Element
Text
Attribute
Comment
xml 用Dom4j解析
1.导入jar包 dom4j.jar
2.创建解析器
SAXReader reader = new SAXReader();
3.解析xml 获得document对象
Document document = reader.read(url);
配置文件Book.xml
<?xml version="1.0" encoding="UTF-8"?>
<书架>
<书 出版社="黑马程序员">
<书名>金梅</书名>
<作者>天涯</作者>
<单价>10</单价>
<批发价>20</批发价>
</书>
<书>
<书名>葵花宝典</书名>
<作者>东方不败</作者>
<单价>10</单价>
</书>
</书架>
public class TestDom4j {
@Test// 1、得到某个具体的节点内容:第2本书的书名--》葵花宝典
public void test1() throws DocumentException{
SAXReader reader = new SAXReader();//创建一个xml解析对象
Document document = reader.read("src/Book.xml");//把xml文档加载到document对象中
Element root = document.getRootElement();
List list = root.elements();//得到当前节点的所有子节点
Element secondBook = (Element) list.get(1);//得到第二本书对象
String name = secondBook.element("书名").getText();//得到当前节点的文本内容
System.out.println(name);
}
@Test // 2、遍历所有元素节点
public void test2() throws DocumentException{
SAXReader reader = new SAXReader();//创建一个xml解析对象
Document document = reader.read("src/Book.xml");//把xml文档加载到document对象中
Element root = document.getRootElement();
treeWalk(root);
}
private void treeWalk(Element ele) {
System.out.println(ele.getName());//输出当前节点的名子
for (int i = 0; i < ele.nodeCount(); i++) {//ele.nodeCount()得到当前节点的所有子节点的数量
Node node = ele.node(i);//取出下标为i的节点
if(node instanceof Element){//判断当前节点是否为标签
treeWalk((Element)node);//把node强转为标签(Element)
}else{
System.out.println(node.getText());
}
}
}
}
解析XML
* XPATH:专门用于查询
* 定义了一种规则。
* 使用的方法:
* selectSingleNode():
* selectNodes():
使用步骤:
1、注意:要导包 jaxen...jar
2、创建解析器
SAXReader reader = new SAXReader();
3、解析xml 获得document对象
Document document = reader.read(url);
// 1、得到某个具体的节点内容:第2本书的书名--
// 2、遍历所有元素节点
public class TestXPath {
@Test
public void test() throws Exception{
SAXReader read = new SAXReader();
Document document = read.read("src/Book.xml");
Node node = document.selectSingleNode("/书架/书[2]/书名");
System.out.println(node.getText());
}
@Test
public void test2() throws Exception{
SAXReader read = new SAXReader();
Document document = read.read("src/Book.xml");
List list = document.selectNodes("//*");
for (int i = 0; i < list.size(); i++) {
Node node = (Node)list.get(i);
System.out.println(node.getName()+"\t"+node.getText());
}
}
}
获取book 下所有的title
public class TestXPath {
@Test
public void test1() throws Exception{
SAXReader read = new SAXReader();
Document document = read.read("src/Dom4jTest.xml");
List nodes = document.selectNodes("/bookstore//book/title");
for (int i = 0; i < nodes.size(); i++) {
Node node = (Node) nodes.get(i);
System.out.println(node.getText());
}
}
}