您的位置:首页 > 其它

简单实现DOM4J解析查询XML

2019-03-03 23:11 330 查看

简单实现DOM4J解析XML文档

Dom4j获取document对象采用的是dom4j的包,因此,在实现之前需要进行导入第三方jar包。
需要导入的包分别有两个,一个是DOM4J的核心jar包,还有一个是在压缩包下的lib文件夹下的 jaxen包

进入DOM4J文档目录,点击index.html进入DOM4J目录,找到快速启动项,就能快速进行定位查询

XPATH

XPath即为XML路径语言,它是一种用来确定XML(标准通用标记语言的子集)文档中某部分位置的语言。XPath基于XML的树状结构,有不同类型的节点,包括元素节点,属性节点和文本节点,提供在数据结构树中找寻节点的能力。XPath 是一门在 XML 文档中查找信息的语言。XPath 用于在 XML 文档中通过元素和属性进行导航。

xpath的几个常用语法:
作用:将XML中的标签的层级关系,使用路径的形式表现出来
语法:
/ 如果路径以斜线 / 开始, 那么该路径就表示到一个元素的绝对路径
// 如果路径以双斜线 // 开头, 则表示选择文档中所有满足双斜线//之后规则的元素(无论层级关系)
* 星号 * 表示选择所有由星号之前的路径所定位的元素
[] 方块号里的表达式可以进一步的指定元素, 其中数字表示元素在选择集里的位置, 而last()函数则表示选择集中的最后一个元素.
@属性名 匹配相同属性名的所有标签

下面进行详细的导包演示:

  • 在Java工程中创建一个lib文件夹
  • 选中要导入的jar包,复制
  • 复制粘贴到lib文件夹下面
  • 导包之后需要把他进行关联,只有进行关联后才能算是导入成功!那么如何关联呢?具体的关联步骤如图
  • 右键导入的文件,把把鼠标放到build path上,有一个 Add to Build Path 选项,单机,添加。成功后效果如下图,出现奶瓶形状之后才算导入成功

    导包成功后,就可以进入正戏啦!
    —在进行解析之前,我们来分析一下步骤
    —实现步骤:
  • 1.获取到document对象
  • 2.写出xpath的路径
  • 3.拿到指定的标签
  • 4.查询指定的文本内容(这里就以查询为例-_-)
    需要使用到的类和API
    SAXReader类:
    Document read(File类型);
    获取一个Document对象
    document.selectSingleNode(xpath);
    直接获取指定的单个节点,需要配合xpath使用
    selectNodes(xpath);
    获取多个节点
    —具体实现代码如下:
public void testQuery() {
/*
* 实现步骤:
* 1.获取到document对象
* 2.写出xpath路径
* 3.拿到指定的标签---selectSingleNode
* 4.查询指定的文本内容
* */
//路径:这里需要创建一个File类来指定你的xml文件的路径
File f = new File("D:/eclipse/JavaEEWorkSpace/XML/contacts.xml");
//获取Document对象
SAXReader sr = new SAXReader();
Document document = sr.read(f);
//配合xpath拿到指定的element对象
String xpath = "//linkman[@id='2']/name";
Node name = document.selectSingleNode(xpath);
//打印输出查询的结果
System.out.println(name.getText());
}

–当然,配合xpath还可以对XML文件进行修改和删除,增加的话要麻烦一点
–下面附上增删改的代码:
当然,这是我做的例子,可以拿去修改下,直接用!嘻嘻,不过,用之前,得看一下你的XML文档啦!
增删改需要关联实体文件,不然操作不成功,嘻嘻。

—增加
Element接口:
Element addElement(标签名)
添加一个标签
XMLWriter类:格式友好的输出形式
XMLWriter(Writer writer,OutputFormat format)
构造一个具有良好输出格式的XML输出对象
void write(Node node)
将一个document输出到实体文件中
void close()
关闭输出
OutputFormat类:输出格式类
OutputFormat createPrettyPrint()
构造一个良好的格式对象

public void testAdd() throws Exception {
/*
* 需求:添加一个linkman标签及其子标签,仿照前两个linkman样式
* */
//路径
File f = new File("D:/eclipse/JavaEEWorkSpace/day04_XML/contacts.xml");
//获取Document对象
SAXReader sr = new SAXReader();
Document document = sr.read(f);
//拿到根标签
Element root = document.getRootElement();
//添加子标签,并设置属性
Element addele = root.addElement("linkman").addAttribute("id", "3");
//添加子标签--并设置文本
addele.addElement("name").setText("gm");
addele.addElement("email").setText("gmclub@gm.com");
addele.addElement("address").addText("哒哒哒哒");
addele.addElement("group").setText("吧嗒吧嗒");
//将数据关联到实体文件中
/*FileWriter fw = new FileWriter(f);
document.write(fw);
fw.close();*/
//友好格式输出,XMLWriter 类中的这个类型OutputFormat.createPrettyPrint()方法可以友好的输出哦,就是按格式排版,嘻嘻。
XMLWriter wri = new XMLWriter(new FileWriter(f),OutputFormat.createPrettyPrint());
wri.write(document);
wri.close();

—修改
Document接口:
void write(Write类型)
将内存数据关联给一个字符输出流
Element接口:
void setText(设置值)
设定标签中的文本数据

public void testAlter() throws Exception {
/*
* 需求:修改第id=3的linkman的group为叭嗒叭哒
* 实现步骤:
* 1.获取对象
* 2.设置值
* 3.保存到文件
* */
//路径
File f = new File("D:/eclipse/JavaEEWorkSpace/day04_XML/contacts.xml");
//获取Document对象
SAXReader sr = new SAXReader();
Document document = sr.read(f);
//获取到element对象
String xpath = "//linkman[@id='3']/group";
document.selectSingleNode(xpath).setText("叭嗒叭哒");
//将数据输出到实体文件
//友好格式输出
XMLWriter wri = new XMLWriter(new FileWriter(f),OutputFormat.createPrettyPrint());
wri.write(document);
wri.close();
}

—删除
Element接口:
Element getParent()
获取父标签
Boolean remove(Element对象)
删除指定标签

public void testRemove() throws Exception {
/*
* 需求:删除id为4的linkman
* 实现步骤:
* 1.获取document对象
* 2.删除指定的element对象
* 3.保存数据到实体文件
* */
//路径
File f = new File("D:/eclipse/JavaEEWorkSpace/day04_XML/contacts.xml");
//获取Document对象
SAXReader sr = new SAXReader();
Document document = sr.read(f);
//删除指定标签
String xpath = "//linkman[@id='4']";
Node linkman = document.selectSingleNode(xpath);
linkman.getParent().remove(linkman);
//将数据输出到实体文件
//友好格式输出
XMLWriter wri = new XMLWriter(new FileWriter(f),OutputFormat.createPrettyPrint());
wri.write(document);
wri.close();
}

—好了,分享就到这里,希望对你有帮助哦,嘻嘻。

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