XML用途
- XML指可扩展标记语言(EXtensible Markup Language),是独立于软件和硬件的信息传输工具。
- XML应用于web开发的许多方面,常用于简化数据的存储和共享
- XML简化数据共享
- XML简化数据传输
- XML简化平台的变更
XML处理指令
- XML处理指令,简称PI(processing instruction)
处理指令用来指挥解析引擎如何解析XML文档内容- <?xml version="1.0" encoding="UTF-8"?>
- 在XML中,所有处理指令都以<?开头,?>结束。
元素和属性
-
XML元素指的是从(且包括)开始标签直到(且包括)结束标签的部分。元素可以包含其他元素、文本或者两者的混合物。元素也拥有属性.例如:
<web-app xmlns=“http://xmlns.jcp.org/xml/ns/javaee”
xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance”
xsi:schemaLocation=“http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd”
version=“3.1”></web-app> -
XML必须有且只能有一个根元素,所谓根元素就是不被其它元素包围(就是在最外层的元素且不能有与它平级的元素)。
-
XML 元素必须遵循以下命名规则:
名称可以含字母、数字以及其他的字符;
名称不能以数字或者标点符号开始;
名称不能以字符 “xml”(或者 XML、Xml)开始;
名称不能包含空格;
可使用任何名称,没有保留的字词。 -
元素的开始标签和结束标签必须一致
-
XML对大小写敏感
-
元素必须有关闭标签
- <a></a>
- <a/>自关闭标签等同于无内容空元素
-
实体引用:实体可以是常用的短语,键盘字符,文件,数据库记录或任何包含数据的项。在XML中,有时实体内包含特殊字符,如<>"’&等,这些均需要对其进行转义,
-
属性提供关于元素的而外(附加)信息。属性通常提供不属于数据组成部分的信息,但是对需要处理这个元素的应用程序来说却很重要。
-
XML属性必须加引号,属性值必须被引号包围,不过单引号和双引号均可使用
-
如果属性值本身包含双引号,那么有必要使用单引号包围它,或者可以使用实体引用
如:
<a id = “a’b’c”></a>
<a id = ‘a"b"c’></a>
使用DOM4J解析XML的步骤:
1.创建SAXReader
2. 使用SAXReader读取XML文档,并声称Document对象
3. 通过Doucument对象获取根元素
4. 从根元素开始逐级获取子元素已达到遍历XML文档数据的目的
- Document提供了获取根元素的方法:
Element getRootElement()
Element 的每个实例用于表示XML文档中的一个元素(一对标签)
其提供了获取标签相关信息的一组方法:
- String getName()获取标签的名字
- String getText()获取标签文本(开始与结束标签中间的文本)
- String elementText(String name);获取指定子标签的文本
- Element element(String name)获取当前标签下指定名字的子标签
- List elements()获取当前标签下所有的子标签
- List elements(String name)获取当前标签下所有相同名字标签(指定的名字)
写出XML文档
大致步骤:
- 创建Doucument对象表示一个空白文档
- 向Doucment对象中添加根元素
Document提供的方法:Element addElement(String name)向当前文档中添加给定名字的根元素,并以Element实例形式将其返回,以便继续对根元素追加操作
注意: Document的这个方法只能调用一次,因为一个文档只能有一个根元素
- 从根元素开始逐级添加子元素以形成XML文档的树结构
- 创建XmlWriter
- 通过XmlWriter将Document写出以生成XML文档
案例1:将xml中的员工信息读取
public static void main(String[] args) {
/*
* 使用DOM4J解析XML的步骤:
* 1.创建SAXReader
* 2. 使用SAXReader读取XML文档,并生成Document对象
* 3. 通过Doucument对象获取根元素
* 4. 从根元素开始逐级获取子元素已达到遍历XML文档数据的目的
*/
/*
* 将emplist.xml文档中的所有员工信息读取
*/
List<Emp> emplist = new ArrayList<>();
try {
SAXReader reader = new SAXReader();
Document doc = reader.read(new File("./emplist.xml"));
/*
* Document提供了获取根元素的方法:
* Element getRootElement()
* Element 的每个实例用于表示XML文档中的一个元素(一对标签)
* 其提供了获取标签相关信息的一组方法:
* - String getName()获取标签的名字
- String getText()获取标签文本(开始与结束标签中间的文本)
- Element element(String name)获取当前标签下指定名字的子标签
- List elements()获取当前标签下所有的子标签
- List elements(String name)获取当前标签下所有相同名字标签(指定的名字)
*/
Element root = doc.getRootElement();//获取了最外层的标签<list><>
// String name = root.getName();
// System.out.println(name);
List<Element> list = root.elements();//获取的还是<emp><>标签的集合
System.out.println(list.size());
//System.err.println(root.element("name"));
/*
* 遍历每个emp标签,用于获取该员工信息
*
*/
for(Element emp:list) {//emp还是一个标签,内部有id名字属性和三个子标签
Element nameEle = emp.element("name");
String name = nameEle.getTextTrim();
int age =Integer.parseInt( emp.element("age").getText());
double salary = Double.parseDouble(emp.elementText("salary"));
String gender = emp.element("gender").getText();
// Element a = emp.getParent();
// System.out.println(a.getName());
Attribute attr = emp.attribute("id");
int id = Integer.parseInt(attr.getValue());
id= Integer.parseInt(emp.attributeValue("id"));
emplist.add(new Emp(id,age,name,salary,gender));
System.out.println(id+" "+name+" "+gender+" "+age+" "+salary);
}
System.out.println("解析完毕。打印emplist:");
for(Emp emp1:emplist) {
System.out.println(emp1);
}
} catch (Exception e) {
e.printStackTrace();
}
}
案例2:将一组员工信息写出到xml文件
public static void main(String[] args) {
List<Emp> emplist = new ArrayList<>();
emplist.add(new Emp(1, 23, "张三", 3000, "男"));//Emp员工类,id,age,name,salary,gender
emplist.add(new Emp(2, 23, "张三", 3000, "男"));
emplist.add(new Emp(3, 23, "张三", 3000, "男"));
emplist.add(new Emp(4, 23, "张三", 3000, "男"));
emplist.add(new Emp(5, 23, "张三", 3000, "男"));
// 1
Document doc = DocumentHelper.createDocument();
// 2
/*
* Document提供的方法:Element addElement(String
* name)向当前文档中添加给定名字的根元素,并以Element实例形式将其返回,以便继续对根元素追加操作
*
* >注意: Document的这个方法只能调用一次,因为一个文档只能有一个根元素
*
*/
Element root = doc.addElement("list");
for (Emp emp : emplist) {
Element empEle = root.addElement("emp");
Element nameE = empEle.addElement("name");
Element ageE = empEle.addElement("age");
Element genderE = empEle.addElement("gender");
Element salaryE = empEle.addElement("salary");
nameE.addText(emp.getName());
ageE.addText(Integer.valueOf(emp.getAge()).toString());
genderE.addText(emp.getGender());
salaryE.addText(Double.valueOf(emp.getSalary()).toString());
empEle.addAttribute("id", Integer.valueOf(emp.getId()).toString());
}
// try (FileOutputStream fos = new FileOutputStream("emplist1.xml");
// OutputStreamWriter osw = new OutputStreamWriter(fos);) {
// doc.write(osw);
// } catch (IOException e) {
// e.printStackTrace();
// }
XMLWriter writer = null;
try {
writer = new XMLWriter(new FileOutputStream("emplist2.xml"),OutputFormat.createPrettyPrint());
writer.write(doc);;
} catch (Exception e) {
}finally {
if(writer!=null) {
try {
writer.close();
} catch (Exception e2) {
}
}
}
}