Dom4j修改XML文件遇到一个比较纠结的问题,求大神。

调活 2012-07-04 04:42:23
这是我修改XML文件的函数问题在下面

/**
* 修改XMl文件指定节点的值
*
* @param xmlPath
* Xml文件路径
* @param CNode
* 判断节点
* @param CValue
* 判断节点值
* @param Node
* 修改节点
* @param newValue
* 修改值
*/
public boolean modifyXml(String xmlPath, String CNode, String CValue,
String Node, String newValue) {
SAXReader reader = new SAXReader();
boolean flag = false;
try {
Document doc = reader.read(this.getClass().getClassLoader()
.getResourceAsStream(xmlPath));
Element root = doc.getRootElement();
List<Element> nodes = root.elements();
for (Element node : nodes) {
List<Element> nodes2 = node.elements();
for (Element node2 : nodes2) {
if (node2.getName().equals(CNode)
&& node2.getData().toString().equals(CValue)) {
for (Element node3 : nodes2) {
if (node3.getName().equals(Node)) {
node3.setText(newValue);
flag = true;
break;
}
}
break;
}
}
}
FileWriter fw = new FileWriter(this.getClass().getClassLoader()
.getResource(xmlPath).getPath());
XMLWriter writer = new XMLWriter(fw);
writer.write(doc);
fw.close();
writer.close();
} catch (Exception e) {
e.printStackTrace();
}
return flag;
}


当我多次修改的时候发现todayLastSendTime并没有修改成功,单步调试的时候是成功了,但是修改todaySendCount的同时又把todayLastSendTime修改成原来的。我是在tomcat下运行,但是我用junit测试的时候没有这个问题。

modifyXml("MessageUsers.xml", "name", name,"todayLastSendTime",todayLastSendTimeStr);
modifyXml("MessageUsers.xml", "name", name,"todaySendCount", todaySendCount + "");
...全文
96 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
调活 2012-07-05
  • 打赏
  • 举报
回复
问题已经解决:下面这种方法,在tomcat这种服务容器中运行的时候,会将读取的文件缓存起来,下次读取的时候还是原来没有修改的文件

Document doc = reader.read(this.getClass().getClassLoader()
.getResourceAsStream(xmlPath));

改成直接通过文件路径来读取就可以了。
调活 2012-07-04
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]


应该是在第二次修改todaySendCount时,传进来的doc里todayLastSendTime的值还是改之前的值吧。
modifyXml方法只是修改一个结点的值,不牵扯到改上次的值啊。调试一下,第二次修改todaySendCount时,一进来,里面todayLastSendTime的值是不是已经是改之前的了?
应该是在执行modifyXml方法前,todayLastSendTim……
[/Quote]
现在是这样的,第二次修改todaySendCount的时候,我单步调试的时候,xml文件时修改成功了,但是读进来的还是一开始没有修改的,就是不明白这是为什么,才郁闷。 但是我用junit测试就没有错,不知道这是不是tomcat 的内存管理方面的问题。
brightyq 2012-07-04
  • 打赏
  • 举报
回复

应该是在第二次修改todaySendCount时,传进来的doc里todayLastSendTime的值还是改之前的值吧。
modifyXml方法只是修改一个结点的值,不牵扯到改上次的值啊。调试一下,第二次修改todaySendCount时,一进来,里面todayLastSendTime的值是不是已经是改之前的了?
应该是在执行modifyXml方法前,todayLastSendTime的值读到的就有问题。
调活 2012-07-04
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

你那个嵌套了多层的循环的for循环,什么意思,到了最里层 flag = true之后,是不是要return了?还break做什么。
只是break的话,那后面无论如何都会执行的。你的意思应该是flag为true的话,后面就不写xml才对吧?
[/Quote]

flag只是用来标记修改成功而已,下面的写文件是要执行的,要不然怎么修改呢?
调活 2012-07-04
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

你那个嵌套了多层的循环的for循环,什么意思,到了最里层 flag = true之后,是不是要return了?还break做什么。
只是break的话,那后面无论如何都会执行的。你的意思应该是flag为true的话,后面就不写xml才对吧?
[/Quote]
return 下面写文件就不执行了、、、、、、
brightyq 2012-07-04
  • 打赏
  • 举报
回复
你那个嵌套了多层的循环的for循环,什么意思,到了最里层 flag = true之后,是不是要return了?还break做什么。
只是break的话,那后面无论如何都会执行的。你的意思应该是flag为true的话,后面就不写xml才对吧?
调活 2012-07-04
  • 打赏
  • 举报
回复
补充:modifyXml("MessageUsers.xml", "name", name,"todayLastSendTime","2012-07-12 10:10:10");
如果先执行上面这句话,xml文件提示修改成功了
我接着执行下面的代码
modifyXml("MessageUsers.xml", "name", name,"todaySendCount", todaySendCount + "");
todayLastSendTime会被重置为原来的时间。

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧