优质文章推荐,适合零基础小白XML入门(从是什么到怎么用)
Dom4j官网下载链接 404
这个链接不好使了,大家可以关注公众号:羽毛的技术栈 回复dom4j 免费获取dom4j的jar包
使用IDEA如何导入jar包
例子所遍历的XML文件内容为
<hr>
<employee no="1111">
<name>张三name>
<age>18age>
<salary>4000salary>
<department>
<dname>会计部dname>
<address>XX大厦address>
department>
employee>
hr>
通过dom4j遍历XML需要创建一个.java文件:
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import javax.xml.parsers.SAXParser;
import java.util.List;
public class HrReader {
public void readXml(){
//写入要读取的文件所在路径
String file = "E:/JavaWeb/xml/src/hr.xml";
//SAXReader 类是读取XML文件的核心类,用于将XML解析后以"树"的形式保存在内存中
SAXReader reader = new SAXReader();
try{
//之前说过Dom4j将XML视为Document对象
Document document = reader.read(file);
//获取XML文档的根节点
Element root = document.getRootElement();
//element方法用于获取指定的标签集合
List<Element> employees = (List<Element>) root.elements("employee");
for(Element employee : employees){
//用Attribute 遍历属性
Attribute attribute = employee.attribute("no");
System.out.println(attribute.getText());
//直接通过 elementText() 方法来读出文本的值
System.out.println(employee.elementText("name"));
System.out.println(employee.elementText("age"));
System.out.println(employee.elementText("salary"));
//出现分支,获取节点
Element department = employee.element("department");
System.out.println(department.elementText("dname"));
System.out.println(department.elementText("address"));
}
}catch (DocumentException e){
e.printStackTrace();
}
}
public static void main(String[] args){
HrReader hrReader = new HrReader();
hrReader.readXml();
}
}
遍历结果为:
可以看出,已经成功读出了XML中存储的值
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import java.io.FileOutputStream;
import java.io.OutputStreamWriter;
import java.io.Writer;
public class HrWriter {
public void writerXml(){
//获取将要更新的xml的文件路径
String file = "E:/JavaWeb/xml/src/hr.xml";
//SAXReader 类是读取XML文件的核心类,用于将XML解析后以"树"的形式保存在内存中
SAXReader reader = new SAXReader();
try{
Document document = reader.read(file);
//获取根节点
Element root = document.getRootElement();
//获取节点
Element employee = root.addElement("employee");
//addAttribute()是添加属性
employee.addAttribute("no","3311");
//addElement()是添加文本
employee.addElement("name").setText("李铁柱");
employee.addElement("age").setText("25");
employee.addElement("salary").setText("3600");
Element department = employee.addElement("department");
department.addElement("dname").setText("人事部");
department.addElement("address").setText("XX大厦-B105");
//以上代码实现了在内存中生成的步骤,下面要来将内存中的东西写到xml文件中
Writer writer = new OutputStreamWriter(new FileOutputStream(file),"UTF-8");
document.write(writer);
//用完之后要释放资源
writer.close();
}catch (Exception e){
e.printStackTrace();
}
}
public static void main(String[] args){
HrWriter hrWriter = new HrWriter();
hrWriter.writerXml();
}
}
运行成功,xml文件中出现了我们添加的信息
表达式 | 描述 |
---|---|
nodename | 选取此节点的所有子节点 |
/ | 从根节点选取 |
// | 从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置 |
. | 选取当前节点 |
… | 选取当前节点的父节点 |
@ | 选取属性 |
路径表达式 | 结果 |
---|---|
bookstore | 选取bookstore元素的所有子节点 |
/bookstore | 选取根元素bookstore。注释:假如路径起始于正斜杠( / ),则此路径始终代表到某元素的绝对路径! |
bookstore/book | 选取属于bookstore的子元素的所有book元素 |
//book | 选取所有book子元素,而不管它们在文档中的位置 |
bookstore//book | 选择属于bookstore元素的后代的所有book元素,而不管它们位于bookstore之下的什么位置。 |
//@lang | 选取名为lang的所有属性 |
路径表达式 | 结果 |
---|---|
/bookstore/book[1] | 选取属于bookstore子元素的第一个book元素。 |
/bookstore/book[last()] | 选取属于 bookstore子元素的最后一个book元素。 |
/bookstore/book[last()-1] | 选取属于bookstore子元素的倒数第二个book元素。 |
/bookstore/book[position()< 3] | 选取最前面的两个属于 bookstore元素的子元素的book元素。 |
//title[@lang] | 选取所有拥有名为 lang的属性的title 元素。 |
//title[ @lang=‘eng’] | 选取所有 title 元素,且这些元素拥有值为eng的lang属性。 |
/bookstore/book[price> 35.00] | 选取bookstore元素的所有book元素,且其中的price元素的值须大于35.00. |
/bookstore/book[price> 35.00]/title | 选取bookstore元素中的book元素的所有title 元素,且其中的price元素的值须大于35.00 |
在使用XPath之前,需要做一些前置的准备工作,下载Jaxen并导入jar包
使用IDEA而不会导入JAR包的看这里:使用IDEA如何导入jar包
这是需要查询的XML文件
<hr>
<employee no="3301">
<name>张三name>
<age>18age>
<salary>4000salary>
<department>
<dname>会计部dname>
<address>XX大厦-A104address>
department>
employee>
<employee no="3302">
<name>李铁柱name>
<age>25age>
<salary>3600salary>
<department>
<dname>人事部dname>
<address>XX大厦-B105address>
department>
employee>
<employee no="3303">
<name>李二狗name>
<age>19age>
<salary>4500salary>
<department>
<dname>会计部dname>
<address>XX大厦-A104address>
department>
employee>
<employee no="3304">
<name>张顺溜name>
<age>29age>
<salary>4800salary>
<department>
<dname>人事部dname>
<address>XX大厦-B105address>
department>
employee>
<employee no="3305">
<name>李四name>
<age>25age>
<salary>5000salary>
<department>
<dname>会计部dname>
<address>XX大厦-A104address>
department>
employee>
<employee no="3306">
<name>王五name>
<age>27age>
<salary>6600salary>
<department>
<dname>人事部dname>
<address>XX大厦-B105address>
department>
employee>
hr>
创建一个XPathTestor类
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.io.SAXReader;
import java.util.List;
public class XPathTestor {
public void xpath(String xpathExp){
String file = "E:/JavaWeb/xml/src/hr.xml";
SAXReader reader = new SAXReader();
try {
Document document = reader.read(file);
List<Node> nodes = document.selectNodes(xpathExp);
for(Node node : nodes){
Element emp = (Element)node;
System.out.println(emp.attributeValue("no"));
System.out.println(emp.elementText("name"));
System.out.println(emp.elementText("age"));
System.out.println(emp.elementText("salary"));
System.out.println("-------------------------------");
}
} catch (DocumentException e) {
e.printStackTrace();
}
}
public static void main(String[] args){
XPathTestor xPathTestor = new XPathTestor();
xPathTestor.xpath("/hr/employee");
}
}
运行结果
这样就能使用XPath了,大家可以一一尝试Xpath的效果
本文若有错误,请各位大佬指正,我会尽快修改
最好的关系就是互相成就,您的三连是我最大的动力,谢谢大家