注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

拥有自己的梦想,跟随心的召唤

平凡是福

 
 
 

日志

 
 

Java XPath 解析 XML 文档  

2015-06-29 15:50:36|  分类: Java |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
XPath 是使用路径表达式快速在 XML 导航的 W3C 标准。

XPath 数据模型
XPath 1.0 只有四种基本数据类型:node-set、number、boolean、string

XPath 选择节点的基本规则
nodename(节点名称):表示选择该节点的所有子节点
/:表示选择根节点
//:表示选择任意位置的某个节点
@: 表示选择某个属性
.:表示当前节点。
..:表示当前节点的父节点
* - 表示匹配任何元素节点,如 //* :选择文档中的所有元素节点。
                                            如 /*/* :表示选择所有第二层的元素节点。
                                            如 /books/* :表示选择books的所有元素子节点。
@* - 表示匹配任何属性值,如 //title[@*] :表示选择所有带有属性的title元素。
| - 选择多个并列的路径,如 //book/title | //book/price :表示同时选择book元素的title子元素和price子元素。

XPath 的谓语条件(Predicate)
所谓"谓语条件",就是对路径表达式的附加条件。所有的条件,都写在方括号"[]"中,表示对节点进行进一步的筛选。如: //book[@name] - 查找含有name属性的所有book节点
//book[@name=‘dragon’] - 查找name属性值为dragon的所有book节点
/books/book[1] - 查找第1个book
/books/book[last()]  - 查找最后一个book
/books/book[last()-1] - 查找倒数第二个book
/books/book[position()<3] - 查找前两个book
//book[price] - 查找带有price子元素的book元素
//book[price>35.00] - 查找带有price子元素且price子元素值大于35book元素
//book[price>35.00]/title - 在上面的结果集中,选择title子元素
//book/price[.>35.00] - 表示选择值大于35的price子元素

范例代码:
String xml = "<root><id name="_id">1</id><中文 name="_中文">中国</中文><strMsg name="msg" xmlns="http://tempuri.org/"/></root>";
InputSource source = new InputSource(new StringReader(xml));
DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance();
//domFactory.setNamespaceAware(true); // 设为true将导致节点 strMsg 没有找到
DocumentBuilder builder = domFactory.newDocumentBuilder();
Document doc = builder.parse(source);

XPathFactory factory = XPathFactory.newInstance();
XPath xpath = factory.newXPath();
XPathExpression expr = xpath.compile("/root");
Node root = (Node) expr.evaluate(doc, XPathConstants.NODE);
Assert.assertNotNull(root);
Assert.assertEquals("root", root.getNodeName());

NodeList nodes = root.getChildNodes();
Assert.assertEquals(3, nodes.getLength());
Node n;
for (int i = 0; i < nodes.getLength(); i++) {
  n = nodes.item(i);
  Assert.assertEquals(1, n.getNodeType());
  System.out.println("tagName=" + n.getNodeName());
  System.out.println("attr name=" + n.getAttributes().getNamedItem("name").getTextContent());
  System.out.println("content=" + n.getTextContent());// not n.getNodeValue()
}
参考:
  评论这张
 
阅读(363)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017