一、修改xml文件内容
对xml文件的操作有编辑、修改、删除。
1、修改
修改属性有两种方法:
//方法一:通过属性对象.setValue("属性值");
Attribute attr=Element对象.attribute("属性名");//调用标签对象的attribute()获取属性
attr.setValue("属性值");//修改属性值
//方法二:可以添加属性和属性值:如果属性名一致,值则会覆盖。
Element对象.addAttribute("属性名","属性值");
2、新增文档--会覆盖原来的文件内容
创建文件:
DocumentHelper.createDocument();//返回一个Document对象。
创建标签
添加根标签需要通过Document对象的addElement("根标签名").//会生成空标签
标签对象(Element对象).addElement("子标签名");//添加子标签,生成空标签。
创建属性
标签对象(Element对象).addAttribute("属性名","属性值");//给标签对象增加属性和属性值。
给标签设置文本内容
标签对象(Element对象).setText("文本内容");//设置文本内容
3、删除节点对象
删除节点对象:
方式一:采用detach()(推荐)
(Element对象)标签对象.detach();
方式二:使用父节点对象remove(子节点对象)
(Element对象)标签对象.getParent().remove(标签对象)
4、输出格式与字节字符流
字符输出:BufferedWriter 字符高效流
字节输出:OutputStream BufferedOutputstream 字节高效流
输出格式:
OutputStream类的createPrettyPrint():优雅格式:有空格换行
createCompactFormat():紧凑格式:用于部署上线。-->OutputFormat类的方法,返回OutputFormat类的对象。
测试代码:
package com.xunpu.xml.write;
import org.dom4j.*;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
import java.io.*;
/**
* 修改contact.xml文件
* 增加内容
* 添加新的文档对象
* 添加节点
* 添加文本
* 在原来xml文件的基础上编辑内容
*/
public class WriteDemo3 {
public static void main(String[] args) throws DocumentException, IOException {
//新增文档
// DocumentHelper里面的一个方法
// public static Document createDocument(Element rootElement) {
// return getDocumentFactory().createDocument(rootElement);
// }
//1)读取文件
Document doc=new SAXReader().read(new File("e:/contact.xml"));
//2)对文件进行的一些操作
// 修改文件
edit();
//添加属性,标签,文本
// add();
//删除文件
//需求:要删除id是001所在的contact标签
// del(doc);
//3)覆盖
OutputStream out=new FileOutputStream(new File("e:/contact.xml"));
OutputFormat format=OutputFormat.createPrettyPrint();
XMLWriter writer=new XMLWriter(out,format);
writer.write(doc);
}
private static void del(Document doc) {
//删除第一个contact子节点对象
Element conElem=doc.getRootElement().element("contact");
// 方式一:采用detach()(推荐)
// conElem.detach();
//方式二:使用父节点对象remove(子节点对象)
conElem.getParent().remove(conElem);
}
//新增文档(会覆盖原来文件的内容)
private static void add() throws IOException {
Document doc=DocumentHelper.createDocument();
//创建节点元素对象: Element
// doc.addElement("contact-list");//会生成空标签
//添加标签
Element rootElem=doc.addElement("contact-list");
Element conElem=rootElem.addElement("contact");//会生成空标签
//添加属性
conElem.addAttribute("id","001");
Element nameElem=conElem.addElement("name");
//添加文本
nameElem.setText("张三");
}
//选中代码,ctrl+alt+m--》抽取为一个方法 方法名自己设置。
//修改相关的内容
private static void edit() throws DocumentException, IOException {
//1)读原来的文件
Document document=new SAXReader().read(WriteDemo3.class.getClassLoader().getResource("contact.xml"));
//2)修改
// 需求:将第一个contact子标签的属性id-->"003"
//方式一:直接可以通过Attribute对象设置属性值
Element conElem=document.getRootElement().element("contact");
Attribute idAttr=conElem.attribute("id");
idAttr.setValue("003");
//方式二:可以添加属性和属性值:如果属性名一致,值则会覆盖。
conElem.addAttribute("id","001");
//修改文本内容
//获取文本所在的标签对象
Element nameElem=conElem.element("name");
nameElem.setText("王五");
//3)覆盖
OutputStream out=new FileOutputStream(new File("e:/contact.xml"));
OutputFormat format=OutputFormat.createPrettyPrint();
XMLWriter writer=new XMLWriter(out,format);
writer.write(document);
writer.close();
}
}
二、xpath语法
Xpath:当前xml文件结构层次比较深的时候,如果还是用Dom4j这种方式,比较麻烦,一些需求需要判断语句。
Xpath可以快速定位到某个标签中,根据xpath表达式的语法!
1、Xpath的一些常用语法
Xpath表达式:常用的有:
1)/:绝对路径 选中根标签/子标签
/AAA-->选中AAA元素
/AAA/CCC-->AAA标签中的CCC子元素
绝对路径,在xml文件中,如果“/”在前面,/contact-list(定位到根节点);
如果斜线在中间:/contact-list/contact:选中子节点contact标签
2)//:不分层级关系 选中所有的标签
//BBB:选中所有的BBB标签
//DDD/EEE:选中所有DDD标签中的EEE标签
/AAA/CCC/DDD/*:选中AAA下的CCC下的DDD中的所有标签
/*/*/*/BBB:BBB有三个父节点,选中满足三个父节点的所有BBB标签。
//*:选中所有标签
3)*:通配符 /contact-list/*:选中contact-list下面的子节点(不包含孙节点):contact标签
/contact-list//*:选中contact-list下面的所有节点
4)[]:进一步定位元素,类似于定语。其中数字元素标签在选择集中的位置 eg:/AAA/BBB[1]
//contact[last()]
5)@:定位属性 @属性名称
6)=://AAA/BBB[@id='属性值'] 确定属性值或文本值
7)逻辑与:and <contact id="003" name="eric">
eg://contact[@id='001' and @name='eric']
8)text():
eg://name[text()='李四']
测试代码:
package com.xunpu.xml.xpath;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Node;
import org.dom4j.io.SAXReader;
import javax.sql.DataSource;
import java.util.List;
/**
* 关于xpath基本语法的使用
*/
public class XpathDemo1 {
public static void main(String[] args) throws DocumentException {
//1)读取当前resources,目录下的contact.xml文件
Document doc=new SAXReader().read(XpathDemo1.class.getClassLoader().getResource("contact.xml"));
//定义遍历
String xpath=null;
// /:绝对路径 选中根标签或者子标签
xpath="/contact-list";
xpath="/contact-list/contact";
// //:不分层级关系,选中所有标签
xpath="//contact";
xpath="//contact//name";
// *:通配符
xpath="/contact-list/*";//当前根节点下的所有子节点,不包含孙节点。
xpath="/contact-list//*";
// []:进一步定位到一个元素,类似于定语
xpath="//contact[1]";//第一个contact标签
xpath="//contact[last()]";//最后一个contact标签
//@指定属性
xpath="//@id";
xpath="//contact[@name]";
xpath="//contact[@id='002']";
//and:逻辑与
xpath="//contact[@id='001' and name='eric']";
//text()文本内容是。。
//文本内容是李四的name标签
xpath="//name[text()]";
//2)使用xpath技术定位节点,遍历
//selectSingleNode(表达式)
//selectNodes()
List<Node> list= doc.selectNodes(xpath);
for(Node node:list){
System.out.println(node);
}
}
}
2、利用Xpath解析网页
html源代码为:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8"></meta>
<title>xpath练习</title>
</head>
<!--
编号 姓名 年龄 性别 住址 电话
-->
<body>
<center><h1>联系人信息</h1></center>
<table border="2" align="center" width="300px" height="300px">
<thead>
<tr align="center">
<th>编号</th>
<th>姓名</th>
<th>年龄</th>
<th>性别</th>
<th>住址</th>
<th>电话</th>
</tr>
</thead>
<tbody>
<tr align="center">
<td>001</td>
<td>张三</td>
<td>20</td>
<td>男</td>
<td>未央区</td>
<td>123456</td>
</tr>
<tr align="center">
<td>002</td>
<td>李四</td>
<td>23</td>
<td>女</td>
<td>长安区</td>
<td>654123</td>
</tr>
<tr align="center">
<td>003</td>
<td>王五</td>
<td>28</td>
<td>男</td>
<td>雁塔区</td>
<td>654321</td>
</tr>
</tbody>
</table>
</body>
</html>
使用xpath技术解析html文件的测试代码为:
package com.xunpu.xml.xpath;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import java.io.File;
import java.util.List;
/**
* 使用xpath解析html页面
*/
public class XpathDemo2 {
public static void main(String[] args) throws DocumentException {
//1)创建SAXReader解析器对象
SAXReader reader = new SAXReader();
//2)获取document对象 读文件,使用绝对路径
Document document=reader.read(new File("D:/比特/Java Web/java_web项目/test/js/xpath练习.html"));
//3)使用xpath先定位title标签 不分层级关系选中title
Element titleElem= (Element) document.selectSingleNode("//title");
System.out.println(titleElem.getText());
//4)获取单元格的内容
System.out.println("编号\t姓名\t年龄\t性别\t\t住址\t\t电话");
//使用xpath定位单元格的内容
List<Element> trElem=document.selectNodes("//tbody/tr");
for(Element e:trElem){
//获取到tr元素
//方式一:dom4j
// String id=((Element)(e.elements("td").get(0))).getText();
//方式二:xpath
String id=e.selectSingleNode("td[1]").getText();
String name=e.selectSingleNode("td[2]").getText();
String gender=e.selectSingleNode("td[3]").getText();
String age=e.selectSingleNode("td[4]").getText();
String address=e.selectSingleNode("td[5]").getText();
String phone=e.selectSingleNode("td[6]").getText();
System.out.println(id+"\t\t"+name+"\t\t"+gender+"\t\t"+age+"\t\t"
+address+"\t\t"+phone);
}
}
}
测试结果为: