定义:
可扩展标记语言,一种用于标记电子文档使其具有结果性的标记语言,它可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。
xml和超文本标记语言区别:
html不一定需要成对出现,xml则一定需要成对出现; html 不区分大小写,但是xml区分。
格式良好的xml:
a)声明信息,用于描述xml的版本和编码方式。
<?xml version= "1.0" encoding= "UTF-8"?>p
b) xml 有且仅有-一个根元素。
c) xml 是大小写敏感的。
d)标签是成对的,而且要正确嵌套I
e)属性值要使用双引号。
f)注释的写法:
<?xml version="1.0" encoding="UTF-8"?>
<class>
<className className="java.lang.Sting">
<methodName>length</methodName>
</className>
</class>
DTD简介
(1)DTD,Document Type Definition,文档类型定义.
(2)DTD用于约束xml的文档格式,保证xml是一个有效的xml.
(3)DTD可以分为两种,内部DTD,外部DTD.
使用内部DTD
(1)内部DTD的定义,语法如下:
(2)元素声明语法:
<!ELEMENT 元素名 (子元素[, 子元素...])>
(3)数量词
>+:表示出现1次或多次,至少一次
>?:表示出现0次或1次
>*:表示出现任意次
(4)属性声明语法:
>属性类型:CDATA,表示字符数据(character data)
>默认值:
- #REQUIRED ,表示必须出现
- #IMPLIED,表示不是必须的
(5)带DTD的完整xml代码:
<?xml version="1.0" econding="UTF-8"?>
<!-- 声明内部DTD -->
<!DOCTYPE scores [
<!ELEMENT scores (student+)>
<!ELEMENT student (name,course,score)>
<!ATTLIST student id CDATA #REQUIRED>
<!ELEMENT name (#PCDATA)>
<!ELEMENT course (#PCDATA)>
<!ELEMENT score (#PCDATA)>
]>
<scores>
<student id="1">
<name>张三</name>
<course>java</course>
<score>89</score>
</student>
<student id="2">
<name>李四</name>
<course>sql</course>
<score>69</score>
</student>
</scores>
使用外部DTD
(1)创建一个独立的DTD文件:scores.dtd
<?xml version="1.0" econding="UTF-8"?>
<!ELEMENT scores (student+)>
<!ELEMENT student (name,course,score)>
<!ATTLIST student id CDATA #REQUIRED>
<!ELEMENT name (#PCDATA)>
<!ELEMENT course (#PCDATA)>
<!ELEMENT score (#PCDATA)>
(2)在xml中引入外部DTD文件
<!-- 引入外部DTD文件 -->
<!DOCTYPE scores SYSTEM "scores.dtd">
利用Java代码解析XML文档
使用 dom4j工具,读取、操作xml文件
import java.io.File;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
/**
* 使用 dom4j工具,读取、操作xml文件
* 需要提前将工具jar包,添加到build path中
*/
public class ReadXMLDemo {
public static void main(String[] args) throws DocumentException {
//创建解析工具对象 org.dom4j.io.SAXReader
SAXReader reader = new SAXReader();
//读取emps.xml文件,解析生成树状结构的文档Document对象
// 即,document对象中,包含了emps.xml文件中所有的内容
Document document=reader.read(new File("Emps.xml"));
System.out.println(document);
//org.dom4j.tree.DefaultDocument@7229724f
//[Document: name file:///D:/eclipse/workspace/xml/Emps.xml]
//获得根元素
Element rootEle = document.getRootElement();
System.out.println("根元素:" + rootEle);
//根元素:org.dom4j.tree.DefaultElement@4c873330
//[Element: <empList attributes: []/>]
//获得子元素
List<Element> list = rootEle.elements();
for(Element ele:list) {
System.out.println("子元素:" + ele);
}
//子元素:org.dom4j.tree.DefaultElement@41629346 [Element: <emp attributes: [org.dom4j.tree.DefaultAttribute@404b9385 [Attribute: name id value "2"]]/>]
//子元素:org.dom4j.tree.DefaultElement@6d311334 [Element: <emp attributes: [org.dom4j.tree.DefaultAttribute@682a0b20 [Attribute: name id value "3"]]/>]
// 子元素:org.dom4j.tree.DefaultElement@3d075dc0 [Element: <emp attributes: [org.dom4j.tree.DefaultAttribute@214c265e [Attribute: name id value "4"]]/>]
}
}
遍历访问元素的属性、子元素、元素名
import java.io.File;
import java.util.List;
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
public class ReadXMLDemo02 {
public static void main(String[] args) throws DocumentException {
SAXReader reader = new SAXReader();
Document document = reader.read(new File("emps.xml"));
Element rootEle = document.getRootElement();
//获得所有的<emp>元素
List<Element> list = rootEle.elements();
//逐一遍历:<emp id = "1"><name>
for(Element ele : list) {
System.out.println("元素名:" + ele.getName());
Attribute attr = ele.attribute("id");
System.out.print(" 属性名: " + attr.getName());
System.out.println(" 属性值:" + attr.getValue());
Element nameEle = ele.element("name"); //获得指定名字的子元素
//获得了:<name>张三</name>
System.out.print(" 子元素名:" + nameEle.getName());
System.out.println("子元素文本内容:" + nameEle.getText());
Element ageEle = ele.element("age"); //获得指定名字的子元素
//获得了:<name>张三</name>
System.out.print(" 子元素名:" + ageEle.getName());
System.out.println("子元素文本内容:" + ageEle.getText());
Element genderEle = ele.element("gender"); //获得指定名字的子元素
//获得了:<name>张三</name>
System.out.print(" 子元素名:" + genderEle.getName());
System.out.println("子元素文本内容:" + genderEle.getText());
Element salaryEle = ele.element("salary"); //获得指定名字的子元素
//获得了:<name>张三</name>
System.out.print(" 子元素名:" + salaryEle.getName());
System.out.println("子元素文本内容:" + salaryEle.getText());
}
}
}
使用dom4j工具,写出一个新的xml文档
步骤:
1)创建一个空的Document文档对象(树状结构的)
2)添加一个根元素
3)向根元素中,添加子元素
4)合理地组织好树状结构
5)将Document对完,通过XMLWriter工具写出
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.XMLWriter;
public class WriteXMLDemo {
public static void main(String[] args) throws IOException {
List<Emp> list = new ArrayList<Emp>();
list.add(new Emp(1,"小李", 12, "女", 12000));
list.add(new Emp(2,"小孟", 13, "女", 13000));
list.add(new Emp(3,"小张", 14, "男", 14000));
list.add(new Emp(4,"小杨", 15, "男", 15000));
//1)创建一个空的Document文档对象(树状结构的)
Document document = DocumentHelper.createDocument();
//2)添加一个根元素
Element rootEle = document.addElement("empList");
//注意,向document对象中添加元素的工作,只能做一次!根元素就一个!
//document对象中的信息:
//<?xml version="1.0" encoding="UTF-8"?>
//<empList/>
//向根元素中,添加<emp>元素,将返回这个元素对象
//3)向根元素中,添加子元素
for(Emp emp : list) {
// emp = new Emp();
Element empEle = rootEle.addElement("emp");//传入子元素的标签名
//向<emp>元素中,添加员工成员变量信息的子元素
empEle.addAttribute("id", emp.getId() + "");
Element nameEle = empEle.addElement("name");
nameEle.addText(emp.getName());
//使用链式写法,添加子元素及文本内容
empEle.addElement("age").addText(emp.getAge() + "");
empEle.addElement("gender").addText(emp.getGender());
empEle.addElement("salary").addText(emp.getSalary() + "");//传入格式化工具
}
//4)合理地组织好树状结构
System.out.println("document对象中的信息:");
System.out.println(document.asXML());
//5)将Document对完,通过XMLWriter工具写出
FileOutputStream fos = new FileOutputStream("emps-new.xml");
OutputStreamWriter osw = new OutputStreamWriter(fos,"utf-8");
OutputFormat format = OutputFormat.createPrettyPrint();
//创建一个美观的格式化工具
XMLWriter xmlWriter = new XMLWriter(osw, format);//传入格式化工具
xmlWriter.write(document);//写出xml文档
xmlWriter.close();
}
}
xpath检索
import java.io.File;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
public class XPathDemo {
public static void main(String[] args) throws DocumentException {
//1.将xml文档读入,转换为Document文档对象
SAXReader saxReader = new SAXReader();
Document document = saxReader.read(new File("books.xml"));
//手工检索,需要写大量代码
//Element rootEle = document.getRootElement();
//Element ele = rootEle.elementByID("1");//null
//System.out.println(ele);
//2.使用XPath工具检索内容
String xpath = "//book[@id='1']";//获得id为1的book元素
//绝对路径形式检索
xpath = "/bookstore/book";
//以绝对路径的形式,查找所有元素;<bookstore>元素下所有的<book>元素
xpath = "/bookstore/book/title";//获得四个<title>元素
xpath = "/bookstore/book/*";//获得每个<book>元素中所有的内容
//没有/时,表示在当前节点上选择检索
xpath = "book";//没有匹配的元素,集合是空的;当前节点中没有book元素
xpath = "."; //表示选取当前节点
//测试的代码document.selectNodes("."),因此当前节点是document
xpath = "bookstore"; //可以获得<bookstore>节点元素
//从当前节点中检索所有匹配的元素,且不考虑位置
xpath = "//book";//查找到所有<book>元素节点
xpath = "//title";//查找到所有<title>元素节点
//
xpath = "//@lang";//获得所有的语种
xpath = "//@category";//获得所有的类别
//使用谓语,添加筛选条件
xpath = "//book[1]";//获取符合检索条件的第一个元素
xpath = "//book[last()]";//使用last()函数,定位到最后一个元素
xpath = "//book[last()-1]";//使用last()-1函数,定位到倒数第二个个元素
xpath = "//book[position()<3]";//获得前两个元素,下标从1开始计数
//使用谓语,结合元素的属性,增加筛选条件
xpath = "//book[@id]"; //查找所有的书,并且带有id属性
xpath = "//book[@id='2']"; //查找id为2的书
//使用谓语,结合元素的子元素,增加筛选条件
xpath = "//book[price>35]";//查找价格大于35元的书
xpath = "//book[price>35]/title";//查找价格大于35元的书 的标题
xpath = "//title[@*]";//查找出带有属性的<title>
System.out.println("使用" + xpath + "进行xpath检索,得到的结果是:");
List list = document.selectNodes(xpath);
for(Object obj : list) {
System.out.println("获得的节点是:");
System.out.println(obj);
System.out.println("XML形式:");
Element ele = (Element)obj;
System.out.println(ele.asXML());
}
//org.dom4j.tree.DefaultElement@6bf2d08e [Element:
//<book attributes: [org.dom4j.tree.DefaultAttribute
//@48cf768c [Attribute: name category value "COOKING"]]/>
}
}