相对于前面的dom方式来解析xml文件,dom4j在它的基础上进行了很大程度上的修改,比以往显得更简洁,而且最大的优势在于添加了XPath编程,更加方便查询。
1.Dom4j是一个简单、灵活的开放源代码的库。Dom4j是由早期开发JDOM的人分离出来而后独立开发的。与JDOM不同的是,dom4j使用接口和抽象基类,虽然Dom4j的API相对要复杂一些,但它提供了比JDOM更好的灵活性。
2. DOM4j中,获得Document对象的方式有三种:
首先:读取XML文件,获得document对象
SAXReader reader = new SAXReader();
Document document = reader.read(new File( "input.xml“ ));
Document document = reader.read(new File( "input.xml“ ));
l
其次:解析XML形式的文本,得到document对象.
String text = "<members></members>";
Document document = DocumentHelper.parseText(text);
Document document = DocumentHelper.parseText(text);
最后:主动创建空document对象.
Document document = DocumentHelper.createDocument();
//创建根节点
//创建根节点
Element root = document.addElement( "members");
3 .元素Element的操作
//获取文档的元素.
Element root = document.getRootElement();
//获取某个元素的指定名称的第一个子节点.
Element element = element.element(“书名");
//获取某个元素的指定名称的所有子元素的集合
List list = element.elements(“书名”);
//添加一个指定名称的子元素
Element childEle = parentEle.addElement(“书名”);
//删除某个元素指定的子元素
parentEle.remove(childEle);
//获取某个元素的指定名称的属性对象
Attribute attr = element.attribute(“id”);
//获取某个元素的指定名称的属性值
String id = element.attributeValue(“id”);
//给元素添加属性或更新其值
Attribute attr = element.addAttribute(“id”,”123”);
//删除某个元素的指定属性
element.remove(attribute);
//获取某个元素的文本内容
String text = element.getText();
//给某个元素添加或更新文本内容
element.setText(“Tom”);
XMLWriter writer = new XMLWriter(new FileWriter("output.xml"));
writer.write(document);
writer.close();
writer.write(document);
writer.close();
5.xpath编程
一些基本的语法,在XPath文档里面全部都能找,而且都是以例子的形式讲述的。使用XPath需要注意:
XPath 是在 XML 文档中查找信息的语言
XPath 是通过元素和属性进行查找
XPath简化了Dom4j查找节点的过程
使用XPath必须导入jaxen-1.1-beta-6.jar否则出现NoClassDefFoundError: org/jaxen/JaxenException。
获取所有符合条件的节点
•document.selectNodes(String xpathExpression)
返回List集合
获取符合条件的单个节点
• document.selectSingleNode(String xpathExpression)
• 返回一个Node对象。
• 如果符合条件的节点有多个,那么返回第一个
7.例子代码
<书架>
<书 书名="Java就业培训教程">
<作者>张孝祥</作者>
<售价>39.00元</售价>
</书>
<书 书名="JavaScript网页开发">
<作者>张孝祥</作者>
<售价>28.00元</售价>
</书>
</书架>
业务需求:
*测试读取 查看《JavaScript网页开发》的售价
* 测试添加节点 <书 书名="Java邮件开发"> <作者>张孝祥</作者> <售价>18.00元</售价> </书>
* 测试添加节点 <书 书名="Java邮件开发"> <作者>张孝祥</作者> <售价>18.00元</售价> </书>
@Test
public void testQueryByName() throws Exception {
//获得文档
SAXReader reader = new SAXReader();
Document document = reader.read(new File(FILEPATH));
String xPath = "//书[@书名='JavaScript网页开发']";
Element bookEle = (Element) document.selectSingleNode(xPath);
if(bookEle!=null) {
System.out.println("售价 = " + bookEle.element("售价").getText());
return;
}
System.out.println("没有寻找到!");
}
@Test
public void testCreateEle() throws Exception {
//测试添加节点 <书 书名="Java邮件开发"> <作者>张孝祥</作者> <售价>18.00元</售价> </书>
SAXReader reader = new SAXReader();
Document document = reader.read(new File(FILEPATH));
Element rootElement = document.getRootElement();
Element bookEle = rootElement.addElement("书");
bookEle.addAttribute("书名", "Java邮件开发");
Element authoreEle = bookEle.addElement("作者");
authoreEle.addText("张孝祥");
Element priceEle = bookEle.addElement("售价");
priceEle.addText("18.00元");
//同步xml文本
OutputStream out = new FileOutputStream(new File(FILEPATH));
OutputFormat format = OutputFormat.createCompactFormat();
XMLWriter xmlWriter = new XMLWriter(out, format);
xmlWriter.write(document);
System.out.println("添加成功!");
}