XML
eXtensible Markup Language
可扩展标记语言
保存数据,用于数据的传递
JAVA中框架的配置文件
index
===========================
1、XML的语法(掌握)
2、DTD(Schema)(了解)
3、JAVA 解析XML(掌握)
1、XML的语法(掌握)
a、xml 文件的第一行为声明
<?xml version="" encoding=""?>
<?xml:声明当前文档为xml文档
version:版本号,1.0,1.1
encoding:编码
b、xml文件中总会有一对根元素
c、xml的标记必须有结尾
d、xml元素必须有正确的嵌套
e、实体
<:<
>:>
&:&
f、CDATA区:存储带有特殊字符的文本数据
<![CDATA[
......
]]>
g、注释
h、xml标记名区分大小写,属性值必须使用""或'',
属性通常需要给属性赋值
满足xml文件语法的要求xml文件,称为格式良好的xml
文件
xml文档的解析器:浏览器,myeclipse,xml spy
课堂快速小练习:
编写一个xml文件,
存储书籍数据
书名,价格,ISBN,作者,出版社
定义三本书
编写一个存储职员信息的xml文件
2、DTD(Schema)(了解)
Document Type Definition
作用:限制xml文件的结构
编写DTD,可以在xml文件内部,也可以定义单独的
DTD文件
引入:DTD
a、引入一定范围内的DTD
<!DOCTYPE 根元素 SYSTEM URL>
b、引入一个公共的DTD
<!DOCTYPE 根元素 PUBLIC "名字" URL>
dtd,xml需求:
根元素:struts
struts子元素:package,global-results零个或多个
package元素中有三个属性,name,extends,namespace
global-results中有两个属性,name,type
package子元素:action,零个或多个
action中三个属性:name(必须有),class(必须有),method
action子元素:result,零个或多个
result中有两个属性:name(必须有),type
<!ELEMENT struts .....>
.........
<!ATTLIST..... >
3、JAVA 解析XML(掌握)
a、解析XML,获取数据
b、java中的数据写入到XML文件中
JAVA中提供两种解析方式
DOM 解析 xml中的dom java
SAX 解析
jdom/dom4j
=======================================
======代码的开始==========
==================================
demo01.xml
================
<?xml version="1.0" encoding="utf-8"?>
<students>
<student>
<name length="10">张三</name>
<age max="90">91</age>
<sex>男</sex>
<info va="聪明的纯爷们"/>
</student>
<student>
<name>李芳</name>
<age>20</age>
<sex>女</sex>
</student>
</students>
================================
demo02.xml
================
<?xml version="1.0" encoding="utf-8"?>
<书库>
<图书>
<书名><<鹿鼎记>></书名>
<价格>45</价格>
<ISBN>2012358</ISBN>
<作者>金庸</作者>
<出版社>达内</出版社>
</图书>
<图书>
<书名>
<![CDATA[
<<鹿鼎记>>
]]>
</书名>
<价格>45</价格>
<ISBN>2012358</ISBN>
<作者>金庸</作者>
<出版社>达内</出版社>
</图书>
<!--
<<xml文件中使用的注释
-->
</书库>
================================
demo03.dtd
================
<!--DTD定义-->
<!ELEMENT employees (emp*)>
<!ELEMENT emp (ename,job?,sal+)>
<!ELEMENT ename (#PCDATA)>
<!ELEMENT job (#PCDATA)>
<!ELEMENT sal (#PCDATA)>
<!--Attribute List-->
<!ATTLIST ename length CDATA #REQUIRED>
<!ATTLIST sal max CDATA #IMPLIED>
================================
demo03.xml
================
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE employees [
<!--DTD定义-->
<!ELEMENT employees (emp*)>
<!ELEMENT emp (ename,job?,sal+)>
<!ELEMENT ename (#PCDATA)>
<!ELEMENT job (#PCDATA)>
<!ELEMENT sal (#PCDATA)>
<!--Attribute List-->
<!ATTLIST ename length CDATA #REQUIRED>
<!ATTLIST sal max CDATA #IMPLIED>
]>
<employees>
<emp>
<ename length="8">Jack</ename>
<job>Salsman</job>
<sal>3000</sal>
</emp>
<emp>
<ename length="10">Mike</ename>
<job>Salsman</job>
<sal max="20000">3000</sal>
</emp>
</employees>
================================
demo04.xml
================
<?xml version="1.0" encoding="utf-8"?>
<!-- 引入一个外部DTD -->
<!DOCTYPE employees SYSTEM "demo03.dtd">
<employees>
<emp>
<ename length="8">Jack</ename>
<job>Salsman</job>
<sal>3000</sal>
</emp>
<emp>
<ename length="10">Mike</ename>
<job>Salsman</job>
<sal max="20000">3000</sal>
</emp>
</employees>
=========项目===================================================
Employee.java
===============
public class Employee {
private String ename;
private String job;
private double sal;
public Employee() {
}
public Employee(String ename, String job, double sal) {
this.ename = ename;
this.job = job;
this.sal = sal;
}
public String getEname() {
return ename;
}
public void setEname(String ename) {
this.ename = ename;
}
public String getJob() {
return job;
}
public void setJob(String job) {
this.job = job;
}
public double getSal() {
return sal;
}
public void setSal(double sal) {
this.sal = sal;
}
}
==================================
TestParseXml.java
==================
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
public class TestParseXml {
public static void main(String[] args) {
//获取被读取xml文件的输入流
InputStream is = TestParseXml
.class.getClassLoader()
.getResourceAsStream("xml/demo04.xml");
//System.out.println(is);
//获取一个解析器
SAXReader reader = new SAXReader();
reader.setValidation(true);
Document doc = null;
try {
//获取整个文档对象
doc = reader.read(is);
//System.out.println(doc);
} catch (DocumentException e) {
e.printStackTrace();}
//获取根元素
Element root = doc.getRootElement();
//System.out.println(root.getName());
//获取所有emp元素
List<Element> elements = root.elements("emp");
/*
//System.out.println(elements.size());
//获取第一个emp元素中的ename元素
Element ename = elements.get(0).element("ename");
//System.out.println(ename.getName());
//获取ename元素中的文本数据
System.out.println(ename.getText());
Employee emp = new Employee();
emp.setEname(ename.getText());
*/
List<Employee> emps = new ArrayList<Employee>();
for(Element ele:elements){
Employee emp = new Employee();
emp.setEname(ele.element("ename").getText());
emp.setJob(ele.element("job").getText());
emp.setSal(Double.parseDouble(ele.element("sal")
.getText()));
emps.add(emp);
}
System.out.println(emps.get(1).getSal());
System.out.println(emps.size());
}
public List<Employee> xmlToEmp(InputStream is){
return null;
}
}
===================================
TestWriteXml.java
===================
package com.tarena.xml.demo;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.XMLWriter;
/**
* 通过dom4j写出一个XML文件
*/
public class TestWriteXml {
public static void main(String[] args) {
Employee emp =
new Employee("张三","软件工程师",8500);
//创建文档对象
Document doc = DocumentHelper.createDocument();
//创建根元素
Element root =
doc.addElement("employees");
//创建元素
Element empEle =
DocumentHelper.createElement("emp");
Element enameEle =
DocumentHelper.createElement("ename");
enameEle.setText(emp.getEname());
empEle.add(enameEle);
root.add(empEle);
OutputStream out = null;
try {
out = new FileOutputStream("employees.xml");
XMLWriter writer = new XMLWriter(out);
writer.write(root);
writer.flush();
writer.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
=========================================================