转: dom4j中使用xpath解析带命名空间的xml文件,取不到节点的解决办法

4 篇文章 0 订阅
哎 基础不扎实啊~~~ DOM4J取了一个小时没取出来 郁闷坏了。。
[quote]
使用 DOM4J 的xpath 非常方便,但是,直接使用xpath 取带命名空间的xm文件,会出现取不到节点的问题.具体问题如下
Xml文档代码

<message id="oNVls-26"
to="admin6@172.17.35.3"
from="admin3@172.17.35.3/Smack"
type="chat">
<subject>zscasvgsadg</subject>
<body>sdvgsdvsaddzsfbnzsdfbvdas</body>
<thread>0pMmg6</thread>
<ext xmlns="infoair:obcs:msg:ext">
<identify>1306663476453admin38</identify>
<sendType>NOR</sendType>
<awokeTime>60</awokeTime>
<x xmlns="infoair:obcs:msg:source" var="130666347645334345"/></ext>
</message>



如果想取

identify 的值: 使用xpath expression : “/message/ext/identify ” 将不能取到值

取x的属性值 : 使用xpath expression: “/message/ext/identify/x/@var “; 也不能取到x var 的属性值


那么该怎么做了,直接上代码:
Java代码

public static MessageNode getNode1(String msg)
throws DocumentException
{
SAXReader reader = new SAXReader();
Document document = reader.read(new StringReader(msg));
XPath xPath = document.createXPath("/message/a:ext/a:identify");
Map<String, String> names = new HashMap<String, String>();
names.put("a", "infoair:obcs:msg:ext");
MessageNode messageNode = new MessageNode();
xPath.setNamespaceURIs(names);
Node node = xPath.selectSingleNode(document);
messageNode.setIdentify(node.getText());
xPath = document.createXPath("/message/a:ext/b:x/@var");
names.put("b", "infoair:obcs:msg:source");
xPath.setNamespaceURIs(names);
node = xPath.selectSingleNode(document);
messageNode.setParentId(node.getText());
return messageNode;
}


names.put("a", "infoair:obcs:msg:ext");


只要 xpath 选择时,加上命名空间就行了

"a " 表示前缀,"infoair:obcs:msg:ext " 表示命名空间。


具体原因,请见:
[url=http://msdn.microsoft.com/zh-cn/library/ms950779.aspx]XML 命名空间以及它们如何影响 XPath 和 XSLT (Extreme XML)[/url]

[/quote]

原文出处 http://beautyofprogram.iteye.com/blog/1138508
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值