简单介绍下使用jdom/dom4j处理XML中使用XPath,顺便散分

xiaohaiz 2004-11-04 04:46:34
现在,作为一个JAVAer而言,还不会读写XML的可能已经是凤毛麟角了。但是XPath并不是所有人都在用,这里俺们就简单介绍一下在解析XML的时候,使用XPath可以大大提高俺们的编程效率。俺们分别用jdom和dom4j来举例,做个非常简单的介绍。

首先看XML:
<Config>
<Child>
<ChildNode name="A">ChildA</ChildNode>
<ChildNode name="B">ChildB</ChildNode>
</Child>
</Config>

假设Config为Root,俺们要解析出每个ChildNode节点的name属性及其文本,按照常规方式,俺们可能需要写下面的代码:
Document doc = ... //得到Document.
Element root = .. // 得到根元素
Element child = .. // 得到Child节点
Element[] childNodes = .. //得到所有ChildNode
String name = ... // 得到Attribute name
String text = ... // 得到Text

看得出来,需要写好多代码。。虽然大家可能都比较熟悉了,但是还是无形中增加了出错的可能性。就算不会出错,写起来也是挺累的,特别是对于那些和俺一样不会copy/paste的人。。

如果使用XPath,就会相对简单多了,先来看看jdom怎么做:
SAXBuilder builder = new SAXBuilder();
Document doc = builder.build(....);
XPath xpath = XPath.newInstance("/Config/Child/ChildNode");
List childNodes = xpath.selectNodes(doc);
for(Object obj:childNodes) {
Element childNode = (Element)obj;

String name = childNode.getAttributeValue("name");
String text = childNode.getText();
}
主要是这里:XPath.newInstance(xpathexpression) <-这里直接使用XPath指定你需要的节点表达式就可以了,这样写的开发效率得到明显提高。

再来看看dom4j是如何实现的:
SAXReader reader = new SAXReader();
Document doc = reader.read(...);
List childNodes = doc.selectNodes("//Config/Child/ChildNode");
for(Object obj:childNodes) {
Node childNode = (Node)obj;

String name = childNode.valueOf("@name");
String text = childNode.getText();
}
doc.selectNodes("//Config/Child/ChildNode")<-直接在Document对象上selectNode就可以得到需要的子节点列表或者单一的节点。另外,childNode.valueOf("@name")<- 可以直接获取名字为name的属性。开发效率同样很高。^^


另外,从上面可以看出来,dom4j在整合XPath方面比起jdom更加无缝,这个方面使用更加方便。
...全文
343 点赞 收藏 2
写回复
2 条回复
panxiongfei 2005年05月23日
来晚了
回复 点赞
zcjl 2004年11月04日
在jdom中使用xpath,我通常用下面的方式:
Element childNode = (Element) XPath.selectSingleNode(doc.getRootElement(), "/Config/Child/ChildNode[@name = 'A']");

List childNodes = XPath.selectNodes(doc.getRootElement(), "/Config/Child/ChildNode");

当然了,得捕获JDOMException
回复 点赞
发动态
发帖子
Java EE
创建于2007-09-28

3.7w+

社区成员

22.5w+

社区内容

J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区公告
暂无公告