目录
-
XML入门
- HTML: 负责网页的结构
- CSS: 负责网页的样式(美观)
- Javascript: 负责在浏览器端与用户进行交互。
- xml:Extend Markup Languge(可扩展标签语言)
- xml开发初衷试图替换html,但实际并不理想,所以xml也能实现html的某些功能,但一般不使用
Xml特点:
1.标签由开发者自己制定的(要按照一定的语法定义)
2.描述带关系的数据(作为软件的配置文件): 包含与被包含的关系
<!--
web服务器(PC):
学生管理系统 -> 添加学生功能 -> 添加学生页面 -> name=eric&[email protected]
前提: 网络(IP地址: oracle:255.43.12.54 端口:1521 )
java代码:使用ip(255.43.12.54)地址和端口(1521),连接oracle数据库,保存学生数据。
把ip地址端口配置到xml文件:
-->
<host>
<ip>255.43.12.54<ip>
<prot>1521</port>
</host>
3.应用场景:tomcat truts Hibernate spring (三大框架)
4.作为数据的载体(存储数据,小型的“数据库”)
<!--
教师管理系统: 姓名 工龄+1 邮箱
发教师数据给财务管理系统:
String teacher = name=张三 & [email protected]&workage=2 字符串
(问题: 1)不好解析 2)不是规范)
-->
<theacher>
<name>张三</name>
<email>[email protected]&workage</eamil>
<workage>2</workage>
</theachr>
-
xml语法
- xml文件以xml后缀名结尾。
- xml文件需要使用xml解析器去解析。浏览器内置了xml解析器
-
xml的标签
- xml标签名称区分大小写。
- xml标签一定要正确配对。
- xml标签名中间不能使用空格
- xml标签名不能以数字开头
- 注意: 在一个xml文档中,有且仅有一个根标签
-
xml属性
语法: <theacher name="eric">老师</theacher>
- 属性值必须写在成对的双引号中
- 一个标签中可以有多个属性,但属性名不能重复
-
xml的注释
<!-- 注释写在里面-->
-
xml文档声明
语法: <?xml version="1.0" encoding="utf-8"?>
version: xml的版本号 encoding: 解析xml文件时查询的码表(解码过程时查询的码表)
注意:
- 如果在ecplise工具中开发xml文件,保存xml文件时自动按照文档声明的encoding来保存文件。
- 如果用记事本工具修改xml文件,注意保存xml文件按照文档声明的encoding的码表来保存。
-
xml常用的转义字符
在xml中内置了一些特殊字符,这些特殊字符不能直接被浏览器原样输出。
如果希望把这些特殊字符按照原样输出到浏览器,对这些特殊字符进行转义。转义之后的字符就叫转义字节。
特殊字符 转义字符
- < <
- > >
- " "
- & &
- 空格 &nsbp;
<teacher>
<zifu> <<</zifu>
<zifu2>>></zifu2>
<zifu3> ""</zifu3>
<zifu4> & &</zifu4>
<zifu5>&nsbp;&nsbp;</zifu5>
</teacher>
-
CDATA块
作用: 可以让一些需要进行包含特殊字符的内容统一进行原样输出。
-
处理指令
作用: 告诉xml解析 如何解析xml文档
案例: <?xml-stylesheet type="text/css" href="1.css"?> 告诉xml解析该xml文档引用了哪个css文件
需要提前xml内容可以使用xml-stylesheet指令指令
-
XML解析
程序读取xml文件的内容。这叫做xml解析
xml解析方式:
- DOM解析(本质是面向对象的编程)
- SAX解析
解析工具
1.DOM解析原理:(本质是一个jar包)
xml解析器一次性把整个xml文档加载进内存,然后在内存中构建一颗Document的对象树,通过Document对象,得到树上的节点对象,通过节点对象访问(操作)到xml文档的内容。
- JAXP (oracle-Sun公司官方) 官方的东西一般不好用
- JDOM工具(非官方,不再JDK中需要手动导入)
- Dom4J工具(非官方)常用
- 三大框架(默认读取xml的工具就是Dom4
SAX解析原理:
Sax解析工具(oracle-sun公司官方)常用
-
Dom4j读取XML文件的常用方法
节点:Iterator Element.nodeIterator(); //获取当前标签节点下的所有子节点
标签:
- Element Document.getRootElement(); //获取xml文档的根标签
- Element ELement.element("标签名") //指定名称的第一个子标签
- Iterator<Element> Element.elementIterator("标签名");// 指定名称的所有子标签
- List<Element> Element.elements(); //获取所有子标签
属性:
- String Element.attributeValue("属性名") //获取指定名称的属性值
- Attribute Element.attribute("属性名");//获取指定名称的属性对象
- Attribute.getName() //获取属性名称
- Attibute.getValue() //获取属性值
- List<Attribute> Element.attributes(); //获取所有属性对象
- Iterator<Attribute> Element.attibuteIterator(); //获取所有属性对象
文本:
- Element.getText(); //获取当前标签的文本
- Element.elementText("标签名") //获取当前标签的指定名称的子标签的文本内容
-
实现Dom4j读取XML文件de案例
package up.up.day;
import java.io.File;
import org.dom4j.Document;
import org.dom4j.io.SAXReader;
/*
shift + ctrl +z 捕获异常
入门 读xml文档
范例:public class Foo {
public Document parse(URL url) throws DocumentException {
SAXReader reader = new SAXReader();
Document document = reader.read(url);
return document;
}
}
*/
public class Demo01 {
public static void main(String[] args) {
try {
//1.创建一个xml解析器对象
SAXReader reader = new SAXReader();
//2.读取xml文档,返回Document对象
Document doc = reader.read(new File("./src/contact.xml"));
System.out.println(doc);
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
//抛出运行时异常
throw new RuntimeException(e);
}
}
}
package gz.itcast.a_dom4j_read;
import java.io.File;
import java.util.Iterator;
import java.util.List;
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.io.SAXReader;
import org.junit.Test;
/**
* 第二个dom4j读取xml文件内容 节点 标签 属性 文本
*
* @author APPle
*
*/
public class Demo2 {
/**
* 得到节点信息
*/
@Test
public void test1() throws Exception {
// 1.读取xml文档,返回Document对象
SAXReader reader = new SAXReader();
Document doc = reader.read(new File("./src/contact.xml"));
// 2.nodeIterator: 得到当前节点下的所有子节点对象(不包含孙以下的节点)
Iterator<Node> it = doc.nodeIterator();
while (it.hasNext()) {// 判断是否有下一个元素
Node node = it.next();// 取出元素
String name = node.getName();// 得到节点名称
// System.out.println(name);
// System.out.println(node.getClass());
// 继续取出其下面的子节点
// 只有标签节点才有子节点
// 判断当前节点是否是标签节点
if (node instanceof Element) {
Element elem = (Element) node;
Iterator<Node> it2 = elem.nodeIterator();
while (it2.hasNext()) {
Node n2 = it2.next();
System.out.println(n2.getName());
}
}
}
}
/**
* 遍历xml文档的所有节点
*
* @throws Exception
*/
@Test
public void test2() throws Exception {
// 1.读取xml文档,返回Document对象
SAXReader reader = new SAXReader();
Document doc = reader.read(new File("./src/contact.xml"));
// 得到根标签
Element rooElem = doc.getRootElement();
getChildNodes(rooElem);
}
/**
* 获取 传入的标签下的所有子节点
*
* @param elem
*/
private void getChildNodes(Element elem) {
System.out.println(elem.getName());
// 得到子节点
Iterator<Node> it = elem.nodeIterator();
while (it.hasNext()) {
Node node = it.next();
// 1.判断是否是标签节点
if (node instanceof Element) {
Element el = (Element) node;
// 递归
getChildNodes(el);
}
}
;
}
/**
* 获取标签
*/
@Test
public void test3() throws Exception {
// 1.读取xml文档,返回Document对象
SAXReader reader = new SAXReader();
Document doc = reader.read(new File("./src/contact.xml"));
// 2.得到根标签
Element rootElem = doc.getRootElement();
// 得到标签名称
String name = rootElem.getName();
System.out.println(name);
// 3.得到当前标签下指定名称的第一个子标签
/*
* Element contactElem = rootElem.element("contact");
* System.out.println(contactElem.getName());
*/
// 4.得到当前标签下指定名称的所有子标签
/*
* Iterator<Element> it = rootElem.elementIterator("contact");
* while(it.hasNext()){ Element elem = it.next();
* System.out.println(elem.getName()); }
*/
// 5.得到当前标签下的的所有子标签
List<Element> list = rootElem.elements();
// 遍历List的方法
// 1)传统for循环 2)增强for循环 3)迭代器
/*
* for(int i=0;i<list.size();i++){ Element e = list.get(i);
* System.out.println(e.getName()); }
*/
/*
* for(Element e:list){ System.out.println(e.getName()); }
*/
/*
* Iterator<Element> it = list.iterator(); //ctrl+2 松开 l
* while(it.hasNext()){ Element elem = it.next();
* System.out.println(elem.getName()); }
*/
// 获取更深层次的标签(方法只能一层层地获取)
Element nameElem = doc.getRootElement().element("contact")
.element("name");
System.out.println(nameElem.getName());
}
/**
* 获取属性
*/
@Test
public void test4() throws Exception {
// 1.读取xml文档,返回Document对象
SAXReader reader = new SAXReader();
Document doc = reader.read(new File("./src/contact.xml"));
// 获取属性:(先获的属性所在的标签对象,然后才能获取属性)
// 1.得到标签对象
Element contactElem = doc.getRootElement().element("contact");
// 2.得到属性
// 2.1 得到指定名称的属性值
/*
* String idValue = contactElem.attributeValue("id");
* System.out.println(idValue);
*/
// 2.2 得到指定属性名称的属性对象
/*
* Attribute idAttr = contactElem.attribute("id"); //getName: 属性名称
* getValue:属性值 System.out.println(idAttr.getName() +"=" +
* idAttr.getValue());
*/
// 2.3 得到所有属性对象,返回LIst集合
/*
* List<Attribute> list = contactElem.attributes(); //遍历属性 for
* (Attribute attr : list) {
* System.out.println(attr.getName()+"="+attr.getValue()); }
*/
// 2.4 得到所有属性对象,返回迭代器
Iterator<Attribute> it = contactElem.attributeIterator();
while (it.hasNext()) {
Attribute attr = it.next();
System.out.println(attr.getName() + "=" + attr.getValue());
}
}
/**
* 获取文本
*/
@Test
public void test5() throws Exception {
// 1.读取xml文档,返回Document对象
SAXReader reader = new SAXReader();
Document doc = reader.read(new File("./src/contact.xml"));
/**
* 注意: 空格和换行也是xml的内容
*/
String content = doc.getRootElement().getText();
System.out.println(content);
// 获取文本(先获取标签,再获取标签上的文本)
Element nameELem = doc.getRootElement().element("contact")
.element("name");
// 1. 得到文本
String text = nameELem.getText();
System.out.println(text);
// 2. 得到指定子标签名的文本内容
String text2 = doc.getRootElement().element("contact")
.elementText("phone");
System.out.println(text2);
}
}
package gz.itcast.a_dom4j_read;
import java.io.File;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
/**
* 把xml文档信息封装到对象中
* @author APPle
*
*/
public class Demo4 {
public static void main(String[] args) throws Exception{
List<Contact> list = new ArrayList<Contact>();
//读取xml,封装对象
SAXReader reader = new SAXReader();
Document doc = reader.read(new File("./src/contact.xml"));
//读取contact标签
Iterator<Element> it = doc.getRootElement().elementIterator("contact");
while(it.hasNext()){
Element elem = it.next();
//创建Contact
Contact contact = new Contact();
contact.setId(elem.attributeValue("id"));
contact.setName(elem.elementText("name"));
contact.setAge(elem.elementText("age"));
contact.setPhone(elem.elementText("phone"));
contact.setEmail(elem.elementText("email"));
contact.setQq(elem.elementText("qq"));
list.add(contact);
}
for (Contact contact : list) {
System.out.println(contact);
}
}
}