dom4j+XPath
body, table{font-family: 微软雅黑; font-size: 10pt}
table{border-collapse: collapse; border: solid gray; border-width: 2px 0 2px 0;}
th{border: 1px solid gray; padding: 4px; background-color: #DDD;}
td{border: 1px solid gray; padding: 4px;}
tr:nth-child(2n){background-color: #f8f8f8;}
| exam.xml | output.xml |
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<exam>
<student idcard="111" examid="222">
<name>张三</name>
<location>沈阳</location>
<grade>89</grade>
</student>
<student idcard="333" examid="444">
<name>李四</name>
<location>大连</location>
<grade>97</grade>
</student>
</exam>
|
<?xml version="1.0" encoding="utf-8"?>
<exam>
<student idcard="111" examid="222">
<name>张三</name>
<location>沈阳</location>
<grade>89</grade>
<sex>男</sex>
</student>
<student idcard="333" examid="444">
<name>李四</name>
<location>大连</location>
</student>
<student idcard="5555" examid="999"/>
</exam>
|
| Dom4j.java | |
|
/* 针对exam.xml文件使用dom4j完成入下操作:
1,得到某个具体的节点内容
2、修改某个元素节点的主体内容
3、向指定元素节点中增加子元素节点
4、向指定元素节点上增加同级元素节点
5、删除指定元素节点
6、遍历所有元素节点
7、获取XML文件某元素属性
*/
|
//开头导入包省略
public class Dom4j {
public static void main(String[] args) throws Exception{
SAXReader reader=new SAXReader();
Document document=reader.read("exam.xml"); //获取document对象
//得到第一个人的姓名
Element rootElement = document.getRootElement();
Element firstStudent=rootElement.element("student");
Element firstName=firstStudent.element("name");
String firstNameText = firstName.getText();
System.out .println(firstNameText);
|
|
//修改第二个人的grade为100
List allStudentList = rootElement.elements();
Element secondStudent=(Element)allStudentList.get(1);
Element secGrade=secondStudent.element("grade");
secGrade.setText("100");
//第一个学生增加性别 - 男
Element firstStuSex= firstStudent.addElement("sex");
firstStuSex.setText("男");
//根节点增加同级元素 一个新的student
Element createnewElement = DocumentHelper.createElement("student");
createnewElement.setAttributeValue("idcard", "5555");
createnewElement.setAttributeValue("examid", "999");
rootElement.add(createnewElement);
//rootElement.addElement("student"); //第二种方式
//删除第二个学生的grade
secGrade.detach(); //remove()也行
|
//遍历所有元素
for(int i=0;i<allStudentList.size();++i){
Element tmpStu=(Element)allStudentList.get(i);
for(int j=0;j<tmpStu.elements().size();j++){
Element tmpChild=(Element)tmpStu.elements().get(j);
String str=tmpChild.getName();
String str1=tmpChild.getText();
System.out .println(str+" "+str1);
}
}
//获取XML属性
String xmlEncoding=document.getXMLEncoding();
String UniquePath=document.getUniquePath();
System.out .println(xmlEncoding+" "+UniquePath); //在当前目录
//标准的保存语句。
//dom4j写回文档会自动写换行方便观看
OutputFormat format = OutputFormat.createPrettyPrint(); // 指定XML编码
format.setEncoding("utf-8");
XMLWriter writer = new XMLWriter(new FileOutputStream ("output.xml"),format);
writer.write(document);
writer.close();
}
}
|
| exam.xml | output2.xml |
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<exam>
<student idcard="111" examid="222">
<name>张三</name>
<location>沈阳</location>
<grade>89</grade>
</student>
<student idcard="333" examid="444">
<name>李四</name>
<location>大连</location>
<grade>97</grade>
</student>
</exam>
|
<?xml version="1.0" encoding="utf-8"?>
<exam>
<student idcard="111" examid="222">
<name>张三</name>
<location>沈阳</location>
<grade>100</grade>
</student>
<student idcard="333" examid="444">
<name>李四</name>
<location>大连</location>
</student>
</exam>
|
|
public class XPath {
public static void main(String[] args) throws Exception{
SAXReader reader = new SAXReader();
Document document = reader.read("exam.xml");
//得到第一个人的姓名
Node firstStuNameNode=document.selectSingleNode("/exam/student/name");
String firstStuName=firstStuNameNode.getText();
System.out.println(firstStuName);
//修改第二个人的grade为100
Node firstStuGradeNode = document.selectSingleNode("/exam/student/grade");
firstStuGradeNode.setText("100");
//删除第二个学生的grade
Node secStuNode=document.selectSingleNode("/exam/student[2]/grade");
secStuNode.detach();
//遍历所有元素
List allNodes=document.selectNodes("/exam/*");
for(int i=0;i<allNodes.size();++i){
Element subNodes=(Element)allNodes.get(i);
for(int j=0;j<subNodes.elements().size();++j){
String subName=((Element)subNodes.elements().get(j)).getName();
String subText=((Element)subNodes.elements().get(j)).getText();
System.out .println(subName+" "+subText);
}
}
|
//标准的保存语句。
OutputFormat format = OutputFormat.createPrettyPrint();
format.setEncoding("utf-8");
XMLWriter writer = new XMLWriter(new FileOutputStream ("output2.xml"),format);
writer.write(document);
writer.close();
}
}
//目前我还只会用XPath来定位,就比DOM4j简单的多,增加还不会
|
dom4j+XPath的更多相关文章
- dom4j 通过 org.dom4j.XPath 设置命名空间来支持 带namespace 的 xpath
测试文件 test.xml <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http:/ ...
- 如何使用DOM4j+xpath 解析
1.首先去dom4j官网下载一个对应版本的JAR包 XML的配置文件 导入一个config.xml文件 下面是dom4j+xpath解析XML文件
- Java解析XML汇总(DOM/SAX/JDOM/DOM4j/XPath)
[目录] 一.[基础知识——扫盲] 二.[DOM.SAX.JDOM.DOM4j简单使用介绍] 三.[性能测试] 四.[对比] 五.[小插曲XPath] 六.[补充] 关键字:Java解析xml.解析x ...
- JAVA与DOM解析器提高(DOM/SAX/JDOM/DOM4j/XPath) 学习笔记二
要求 必备知识 JAVA基础知识.XML基础知识. 开发环境 MyEclipse10 资料下载 源码下载 sax.dom是两种对xml文档进行解析的方法(没有具体实现,只是接口),所以只有它们是无 ...
- JAVA通过XPath解析XML性能比较(原创)
(转载请标明原文地址) 最近在做一个小项目,使用到XML文件解析技术,通过对该技术的了解和使用,总结了以下内容. 1 XML文件解析的4种方法 通常解析XML文件有四种经典的方法.基本的解析方式有两种 ...
- XML学习笔记(2)--dom4j操作XML
1. 介绍(四种方式的比较这部分转载自:http://www.blogjava.net/xcp/archive/2010/02/12/312617.html) 1)DOM(JAXP Crimson解析 ...
- Dom4j解析Xml文件,Dom4j创建Xml文件
Dom4j解析Xml文件,Dom4j创建Xml文件 >>>>>>>>>>>>>>>>>>&g ...
- java创建XML及开源DOM4J的使用
java import java.io.File; import java.io.StringWriter; import javax.xml.parsers.DocumentBuilder; imp ...
- XPath详解
xPath技术 1 引入 问题:当使用dom4j查询比较深的层次结构的节点(标签,属性,文本),比较麻烦!!! 2 xPath作用 主要是用于快速获取所需的节点对象. 3 在dom4j中如何使用 ...
随机推荐
- 批量启动application pool
在powershell中执行 Get-ChildItem IIS:\AppPools | where {$_.state -eq "Stopped"} | Start-WebApp ...
- 第四章 消息摘要算法--SHA
注意:本节内容主要参考自<Java加密与解密的艺术(第2版)>第6章“验证数据完整性--消息摘要算法” 4.1.SHA 原理:消息摘要长度(可以定量为加密后的字符串的长度)越长,安全性越高 ...
- 关于express项目的创建与启动
没有经常用,所以经常搞错, 创建express项目,需要新建一个文件夹名,这个文件名就是用来承载express的内容的, 好了.打开终端,cd至创建的文件夹之下. 也可以直接这样,如以下,admin为 ...
- RabbitMQ入门_09_TTL
参考资料:https://www.rabbitmq.com/ttl.html A. 为队列设置消息TTL TTL 是 Time-To-Live 的缩写,指的是存活时间.RabbitMQ 可以为每一个队 ...
- 2018年全国多校算法寒假训练营练习比赛(第一场)G 圆圈
https://www.nowcoder.com/acm/contest/67/G 思路: 分形. 记录中间左边点的坐标,然后推出另外3个点的坐标,递归到最简单的情况. 代码: #include< ...
- js事件轮询机制
console.log(1) setTimeout(function(){ console.log(2) },0); console.log(3) 毫无疑问:运行结果是1 3 2 也就是说:setTi ...
- 增加centos7.3上安装php7的php-soap扩展
代码传到正式服务器上去就:Class 'SoapClient' not found,只能是soap扩展没装! 因为服务器上面的PHP是7.1.11的,所以soap也要装7.1.11的,否则会冲突 ...
- codeforces 516c// Drazil and Park// Codeforces Round #292(Div. 1)
题意:一个圆环上有树,猴子上下其中一棵树,再沿着换跑,再上下另一棵树.给出一个区间,问最大的运动距离是. 给出区间大小dst,和数高数组arr. 设区间[x,y],a[x]=2*arr[x]+dst[ ...
- Android Studio 常用快捷键和使用技巧
Android Studio 1.Ctrl+E,可以显示最近编辑的文件列表 2.Shift+Click可以关闭文件 3.Ctrl+[或]可以跳到大括号的开头结尾 4.Ctrl+Shift+Backsp ...
- 部署Spring web项目遇到的问题及解决方案
非常悲伤的一个提示: 错误源码: Caused by: java.lang.ArrayStoreException: sun.reflect.annotation.TypeNotPresentExce ...