您的位置:首页 > 其它

XML学习总结-xml概念和dom4j解析技术-(一)

2016-12-08 18:04 549 查看
一.HTML和XML的区别之处
HTML HyperTextMarkupLanguage 超文本标记语言,由w3c组织规定,约100多个标签,用于规定网页结构。

 

XML ExtendMarkupLanguage 可扩展标记语言,标签由开发者自定义

作用

-描述带关系的数据,作为软件的配置文件,包含与被包含的关系

例如:使用ip(255.43.12.54)地址和端口(1521),连接oracle数据库,保存学生数据。

把ip地址端口配置到xml文件:
host.xml

<host>
<ip>255.43.12.55</ip>
<port>1521</port>
</host>


  

-作为数据的载体,用于存储数据,是一个小型的“数据库”

例如

教师信息管理系统存储教师的信息

teacher.xml
<teacher>
<name>张三</name>
<email>zhangsan@qq.com</email>
<workage>2</workage>
</teacher>


  

二.XML语法

1.标签

1> <eleName></eleName>  标签体内有内容

     </eleName> 标签体内没有内容

2> xml 标签名称区分大小写

3> xml标签一定要正确配对

4> xml标签名中间不能有空格

5> xml标签名不能以数字开头

6> 在一个xml文档中有且仅有一个根标签

2.

   语法 <elemName name="cxspace"></elemName>

   注意事项: 

-属性值必须1以引号包含,不能省略,也不能单双引号混合使用

-一个标签可以有多个属性,单数不能出现重复的属性名

3.注释

<!--注释内容-->

4.文档声明

语法:<?xml version="1.0" encoding="utf-8">

version:xml版本号

encoding:解析xml文件时查询的码表

注意

1)如果在eclipse或者idea工具中开发xml文件,保存xml文件时自动按照文档声明的encoding来保存

2)用记事本工具修改xml文件,注意保存xml文件按照文档声明的encoding的码表来保存

5.转义字符

xml中内置了一些特殊字符,这些字符不能直接被浏览器原样输出。如果希望把这些特殊字符按照原样输出到浏览器,需要对这些特殊字符进行转义

特殊字符     转义字符
<             <
>             >
"             "
&             &
空格          &nsbp;


  

6.CDATA块

可以让一些需要进行包含特殊字符的内容哦给统一原样输出

7.处理指令

告诉xml解析器如何解析xml文档

三.XML解析

DOM解析

DOM解析原理:xml解析器一次性把整个xml文档加载进内存,然后在内存中构建出一颗Document的对象树,通过Document对象,得到树上的节点对象,通过节点对象访问到xml文档中的内容.

Dom4j解析工具解析步骤

1 > 导入  dom4j-1.6.1.jar 核心包

2 > 编写Dom4j读取xml文件代码

public static void main(String[] args) {
try {
//1.创建一个xml解析器对象
SAXReader reader = new SAXReader();
//2.读取xml文档,返回Document对象
Document doc = reader.read(new File("./src/student.xml"));

System.out.println(doc);
} catch (DocumentException e) {
e.printStackTrace();
throw new RuntimeException(e);
}

}


上述代码可以读取src下的student.xml进内存,返回文档树对象.

Dom4j包中读取xml文件内容的API

节点:

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("标签名") //获取当前标签的指定名称的子标签的文本内容

实例代码

contact.xml

<?xml version="1.0" encoding="utf-8"?>
<contactList>
<contact id="001">
<name>张三</name>
<age>20</age>
<phone>134222223333</phone>
<email>zhangsan@qq.com</email>
<qq>432221111</qq>
</contact>
<contact id="002">
<name>李四</name>
<age>20</age>
<phone>134222225555</phone>
<email>lisi@qq.com</email>
<qq>432222222</qq>
</contact>
</contactList>                              


entity实体类

package gz.itcast.a_dom4j_read;

public class Contact {
private String id;
private String name;
private String age;
private String phone;
private String email;
private String qq;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getQq() {
return qq;
}
public void setQq(String qq) {
this.qq = qq;
}
@Override
public String toString() {
return "Contact [age=" + age + ", email=" + email + ", id=" + id
+ ", name=" + name + ", phone=" + phone + ", qq=" + qq + "]";
}

}


调用api的demo

package gz.itcast.a_dom4j_read;

import java.io.File;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.io.SAXReader;

/**
* 第一个Dom4j读取xml文档的例子
* @author APPle
*
*/
public class Demo1 {

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 (DocumentException e) {
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.Iterator;
import java.util.List;

import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.Text;
import org.dom4j.io.SAXReader;
import org.junit.Test;
/**
* 练习-完整读取xml文档内容
* @author APPle
*
*/
public class Demo3 {

@Test
public void test() throws Exception{
//读取xml文档
SAXReader reader = new SAXReader();
Document doc =
reader.read(new File("./src/contact.xml"));

//读取根标签
Element rootELem = doc.getRootElement();

StringBuffer sb = new StringBuffer();

getChildNodes(rootELem,sb);

System.out.println(sb.toString());

}

/**
* 获取当前标签的所有子标签
*/
private void getChildNodes(Element elem,StringBuffer sb){
//System.out.println(elem.getName());

//开始标签
sb.append("<"+elem.getName());

//得到标签的属性列表
List<Attribute> attrs = elem.attributes();
if(attrs!=null){
for (Attribute attr : attrs) {
//System.out.println(attr.getName()+"="+attr.getValue());
sb.append(" "+attr.getName()+"=\""+attr.getValue()+"\"");
}
}
sb.append(">");

//得到文本
//String content = elem.getText();
//System.out.println(content);
Iterator<Node> it = elem.nodeIterator();
while(it.hasNext()){
Node node = it.next();

//标签
if(node instanceof Element){
Element el = (Element)node;
getChildNodes(el,sb);
}

//文本
if(node instanceof Text){
Text text = (Text)node;
sb.append(text.getText());
}
}

//结束标签
sb.append("</"+elem.getName()+">");

}
}


 知识点list集合使用,list集合遍历

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);
}

}
}


  

Dom4j中修改xml文档的api

 XMLWriter writer = new XMLWriter(OutputStream, OutputForamt)

 wirter.write(Document);

 修改xml文档的API

    增加:

       DocumentHelper.createDocument()  增加文档

       addElement("名称")  增加标签

       addAttribute("名称",“值”)  增加属性

    修改:

       Attribute.setValue("值")  修改属性值

       Element.addAtribute("同名的属性名","值")  修改同名的属性值

       Element.setText("内容")  修改文本内容

    删除

       Element.detach();  删除标签 

       Attribute.detach();  删除属性

实例demo

package gz.itcast.a_dom4j_write;

import java.io.File;
import java.io.FileOutputStream;

import org.dom4j.Document;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;

/**
* 第一个写出内容到xml文档
* @author APPle
*
*/
public class Demo1 {

public static void main(String[] args) throws Exception{
//一、读取或创建一个Document对象
//读取day07项目的xm文件
Document doc = new SAXReader().read(new File("./src/contact.xml"));

//二、修改Document对象内容

//三、把修改后的Document对象写出到xml文档中
//指定文件输出的位置
FileOutputStream out = new FileOutputStream("e:/contact.xml");
//1.创建写出对象
XMLWriter writer = new XMLWriter(out);

//2.写出对象
writer.write(doc);
//3.关闭流
writer.close();
}

}


  

package gz.itcast.a_dom4j_write;

import java.io.File;
import java.io.FileOutputStream;

import org.dom4j.Document;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
/**
* 讨论写出内容到xml文档的细节
* @author APPle
*
*/
public class Demo2 {

/**
* @param args
*/
public static void main(String[] args) throws Exception{
Document doc = new SAXReader().read(new File("./src/contact.xml"));
//指定文件输出的位置
FileOutputStream out = new FileOutputStream("e:/contact.xml");
/**
* 1.指定写出的格式
*/
OutputFormat format = OutputFormat.createCompactFormat(); //紧凑的格式.去除空格换行.项目上线的时候
//OutputFormat format = OutputFormat.createPrettyPrint(); //漂亮的格式.有空格和换行.开发调试的时候
/**
* 2.指定生成的xml文档的编码
*    同时影响了xml文档保存时的编码  和  xml文档声明的encoding的编码(xml解析时的编码)
*    结论: 使用该方法生成的xml文档避免中文乱码问题。
*/
format.setEncoding("utf-8");

//1.创建写出对象
XMLWriter writer = new XMLWriter(out,format);

//2.写出对象
writer.write(doc);
//3.关闭流
writer.close();
}

}


 

package gz.itcast.a_dom4j_write;

import java.io.File;
import java.io.FileOutputStream;

import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
import org.junit.Test;

/**
* 修改xml内容
* 增加:文档,标签 ,属性
* 修改:属性值,文本
* 删除:标签,属性
* @author APPle
*
*/
public class Demo3 {

/**
* 增加:文档,标签 ,属性
*/
@Test
public void test1() throws Exception{
/**
* 1.创建文档
*/
Document doc = DocumentHelper.createDocument();
/**
* 2.增加标签
*/
Element rootElem = doc.addElement("contactList");
//doc.addElement("contactList");
Element contactElem = rootElem.addElement("contact");
contactElem.addElement("name");
/**
* 3.增加属性
*/
contactElem.addAttribute("id", "001");
contactElem.addAttribute("name", "eric");

//把修改后的Document对象写出到xml文档中
FileOutputStream out = new FileOutputStream("e:/contact.xml");
OutputFormat format = OutputFormat.createPrettyPrint();
format.setEncoding("utf-8");
XMLWriter writer = new XMLWriter(out,format);
writer.write(doc);
writer.close();
}

/**
* 修改:属性值,文本
* @throws Exception
*/
@Test
public void test2()	throws Exception{
Document doc = new SAXReader().read(new File("./src/contact.xml"));

/**
* 方案一: 修改属性值   1.得到标签对象 2.得到属性对象 3.修改属性值
*/
//1.1  得到标签对象
/*
Element contactElem = doc.getRootElement().element("contact");
//1.2 得到属性对象
Attribute idAttr = contactElem.attribute("id");
//1.3 修改属性值
idAttr.setValue("003");
*/
/**
* 方案二: 修改属性值
*/
//1.1  得到标签对象
/*
Element contactElem = doc.getRootElement().element("contact");
//1.2 通过增加同名属性的方法,修改属性值
contactElem.addAttribute("id", "004");
*/

/**
* 修改文本 1.得到标签对象 2.修改文本
*/
Element nameElem = doc.getRootElement().
element("contact").element("name");
nameElem.setText("李四");

FileOutputStream out = new FileOutputStream("e:/contact.xml");
OutputFormat format = OutputFormat.createPrettyPrint();
format.setEncoding("utf-8");
XMLWriter writer = new XMLWriter(out,format);
writer.write(doc);
writer.close();
}

/**
* 删除:标签,属性
* @throws Exception
*/
@Test
public void test3() throws Exception{
Document doc = new SAXReader().read(new File("./src/contact.xml"));

/**
* 1.删除标签     1.1 得到标签对象  1.2 删除标签对象
*/
// 1.1 得到标签对象
/*
Element ageElem = doc.getRootElement().element("contact")
.element("age");

//1.2 删除标签对象
ageElem.detach();
//ageElem.getParent().remove(ageElem);
*/
/**
* 2.删除属性   2.1得到属性对象  2.2 删除属性
*/
//2.1得到属性对象
//得到第二个contact标签
Element contactElem = (Element)doc.getRootElement().
elements().get(1);
//2.2 得到属性对象
Attribute idAttr = contactElem.attribute("id");
//2.3 删除属性
idAttr.detach();
//idAttr.getParent().remove(idAttr);

FileOutputStream out = new FileOutputStream("e:/contact.xml");
OutputFormat format = OutputFormat.createPrettyPrint();
format.setEncoding("utf-8");
XMLWriter writer = new XMLWriter(out,format);
writer.write(doc);
writer.close();
}
}


  

package gz.itcast.a_dom4j_write;

import java.io.File;
import java.io.FileOutputStream;
import java.util.Iterator;

import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
import org.junit.Test;

/**
*  课堂练习:
* 1.使用dom4j的api来生成以下的xml文件
<Students>
<Student id="1">
<name>张三</name>
<gender>男</gender>
<grade>计算机1班</grade>
<address>广州天河</address>
</Student>
<Student id="2">
<name>李四</name>
<gender>女</gender>
<grade>计算机2班</grade>
<address>广州越秀</address>
</Student>
</Students>

2.修改id为2的学生的姓名,改为“王丽”

3.删除id为2的学生
* @author APPle
*
*/
public class Demo4 {

/**
* 1.生成指定xml文档
* @throws Exception
*/
@Test
public void test1() throws Exception{
//1.内存创建xml文档
Document doc = DocumentHelper.createDocument();

//2.写入内容
Element rootElem = doc.addElement("Students");

//2.1 增加标签
Element studentElem1 = rootElem.addElement("Student");
//2.2 增加属性
studentElem1.addAttribute("id", "1");
//2.3 增加标签,同时设置文本
studentElem1.addElement("name").setText("张三");
studentElem1.addElement("gender").setText("男");
studentElem1.addElement("grade").setText("计算机1班");
studentElem1.addElement("address").setText("广州天河");

//2.1 增加标签
Element studentElem2 = rootElem.addElement("Student");
//2.2 增加属性
studentElem2.addAttribute("id", "2");
//2.3 增加标签,同时设置文本
studentElem2.addElement("name").setText("李四");
studentElem2.addElement("gender").setText("女");
studentElem2.addElement("grade").setText("计算机2班");
studentElem2.addElement("address").setText("广州越秀");

//3.内容写出到xml文件
//3.1 输出位置
FileOutputStream out = new FileOutputStream("e:/student.xml");
//3.2 指定格式
OutputFormat format = OutputFormat.createPrettyPrint();
// 设置编码
format.setEncoding("utf-8");
XMLWriter writer = new XMLWriter(out,format);
//3.3 写出内容
writer.write(doc);
//3.4关闭资源
writer.close();

}

/**
* 2.修改id为2的学生姓名
* @throws Exception
*/
@Test
public void test2() throws Exception{
//1.查询到id为2的学生
Document doc = new SAXReader().read(new File("e:/student.xml"));
//1.1 找到所有的Student标签
Iterator<Element> it = doc.getRootElement().elementIterator("Student");
while(it.hasNext()){
Element stuElem = it.next();
//1.2 查询id为id的学生标签
if(stuElem.attributeValue("id").equals("2")){
stuElem.element("name").setText("王丽");
break;
}
}

//3.1 输出位置
FileOutputStream out = new FileOutputStream("e:/student.xml");
//3.2 指定格式
OutputFormat format = OutputFormat.createPrettyPrint();
// 设置编码
format.setEncoding("utf-8");
XMLWriter writer = new XMLWriter(out,format);
//3.3 写出内容
writer.write(doc);
//3.4关闭资源
writer.close();
}

/**
* 3.删除id为2的学生
* @throws Exception
*/
@Test
public void test3() throws Exception{
//1.查询到id为2的学生
Document doc = new SAXReader().read(new File("e:/student.xml"));
//1.1 找到所有的Student标签
Iterator<Element> it = doc.getRootElement().elementIterator("Student");
while(it.hasNext()){
Element stuElem = it.next();
//1.2 查询id为id的学生标签
if(stuElem.attributeValue("id").equals("2")){
//1.3 删除该学生标签
stuElem.detach();
break;
}
}

//3.1 输出位置
FileOutputStream out = new FileOutputStream("e:/student.xml");
//3.2 指定格式
OutputFormat format = OutputFormat.createPrettyPrint();
// 设置编码
format.setEncoding("utf-8");
XMLWriter writer = new XMLWriter(out,format);
//3.3 写出内容
writer.write(doc);
//3.4关闭资源
writer.close();
}
}


  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: