关于dom4j 操作xml xpath的问题。获取不到node节点

wzlblair 2014-11-14 05:37:36
在做Android相关的开发,针对xml 操作,希望用xpath来查找xml节点。

使用的包包括:
dom4j-1.6.1.jar
fastjson-1.1.24.jar
jaxen-1.1-beta-6.jar
jaxen-1.1-beta-6.jar

代码中node1 可以获得得到Root节点。
但是node2 就为null。
并且node3的时候 也为null。 请各位大神,指导指导。

在C#中,我用 该xpath,测试,能够去得到node节点,证明路径是正确的。
我快崩溃了。。一个多小时了。

public class Operation_XMl {
private Document doc;
public Operation_XMl(Context context, int nodeId) {
SAXReader reader = new SAXReader();
try {
this.doc = reader.read(context.getAssets().open("PostXML.xml"));
this.SetSingleBody(nodeId);
} catch (Exception ex) {
ex.printStackTrace();
}
}

public void SetSingleBody(int nodeId) {
Node node1= this.doc.selectSingleNode("/Root");
Node node2= this.doc.selectSingleNode("/Root/PostNode[@id='1']");
Node node3= node1.selectSingleNode("PostNode");
}
}


xml结构如下

<?xml version="1.0" encoding="UTF-8"?>
<Root>
<PostNode id="1" description="查询签到" nextstep="0" dedelay="3000">
</PostNode>
</Root>


...全文
413 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
猿人林克 2014-11-24
  • 打赏
  • 举报
回复
引用 3 楼 wzlblair 的回复:
[quote=引用 2 楼 ooppookid 的回复:] 接上贴,xpath如下,没有任何问题:
Node node3 = node1.selectSingleNode("/Root/PostNode[@id='1']");
		System.out.println(node3.getName());//PostNode
		System.out.println(((Element)node3).attributeValue("description"));//查询签到
附带我的包: dom4j-1.6.1.jar jaxen-1.1-beta-6.jar 就这两个就够了,第一个基础,第二个使用xpath时候引入就可以,一般也不用,大项目都是用xstream对象化,基本不会这样手动去拆,不好维护不说而且重复工作太大,违背面向对象的设计
谢谢你,我的问题已经解决。瞎捣鼓,把BIN文件删了后,突然又好了,神奇的很。 因为我这个程序接受的参数格式不固定,可能多种变化,我的想法是用XmlDocument 对象来 ,根据配置文件中节点路径来查找值,这样不必为每一种返回的格式定义一个对象。 您觉得这种方法如何。 而用xstream 不是要针对每种返回的类型定义一个对象,然后再反序列化?[/quote] xstream就是把xml格式对象化,定义一些主子类,这样的好处是面向对象,xml结构有调整的时候只需要调整类的属性即可达到目的,其他逻辑性代码都不用动,而且就调整一个地方即可。当然手工用dom去拆装也没问题,就是可读性不高,不好扩展和维护。
wzlblair 2014-11-24
  • 打赏
  • 举报
回复
引用 2 楼 ooppookid 的回复:
接上贴,xpath如下,没有任何问题:
Node node3 = node1.selectSingleNode("/Root/PostNode[@id='1']");
		System.out.println(node3.getName());//PostNode
		System.out.println(((Element)node3).attributeValue("description"));//查询签到
附带我的包: dom4j-1.6.1.jar jaxen-1.1-beta-6.jar 就这两个就够了,第一个基础,第二个使用xpath时候引入就可以,一般也不用,大项目都是用xstream对象化,基本不会这样手动去拆,不好维护不说而且重复工作太大,违背面向对象的设计
谢谢你,我的问题已经解决。瞎捣鼓,把BIN文件删了后,突然又好了,神奇的很。 因为我这个程序接受的参数格式不固定,可能多种变化,我的想法是用XmlDocument 对象来 ,根据配置文件中节点路径来查找值,这样不必为每一种返回的格式定义一个对象。 您觉得这种方法如何。 而用xstream 不是要针对每种返回的类型定义一个对象,然后再反序列化?
猿人林克 2014-11-14
  • 打赏
  • 举报
回复
接上贴,xpath如下,没有任何问题:
Node node3 = node1.selectSingleNode("/Root/PostNode[@id='1']");
		System.out.println(node3.getName());//PostNode
		System.out.println(((Element)node3).attributeValue("description"));//查询签到
附带我的包: dom4j-1.6.1.jar jaxen-1.1-beta-6.jar 就这两个就够了,第一个基础,第二个使用xpath时候引入就可以,一般也不用,大项目都是用xstream对象化,基本不会这样手动去拆,不好维护不说而且重复工作太大,违背面向对象的设计
猿人林克 2014-11-14
  • 打赏
  • 举报
回复
代码如下,应该非常简单才对,注意一下你的attr由中文,需要解码:
import java.io.File;

import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.io.SAXReader;

public class Dom4jTest {

public static void main(String[] args) {
// TODO Auto-generated method stub
SAXReader reader = new SAXReader();
reader.setEncoding("utf-8");
Document document = null;
try {
System.out.println(System.getProperty("user.dir"));
document = reader.read(new File("src/test/PostXML.xml"));
} catch (Exception ex) {
ex.printStackTrace();
}
Node node1 = document.selectSingleNode("Root");
System.out.println(node1.getName());
Node node2 = node1.selectSingleNode("PostNode");
System.out.println(node2.getName());
System.out.println(((Element)node2).attributeValue("dedelay"));
System.out.println(((Element)node2).attributeValue("description"));
}

}


结果如下:

50,527

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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