您的位置:首页 > 其它

Dom4J解析技术

2016-09-11 20:48 477 查看
前面的话

本文主要讲解有关Dom4j技术和xpath配合下的优化!

目录:


为什么需要Dom4J

DOM4J怎么用

[b]xpath怎么配合DOM4J[/b]



一 为什么需要Dom4J

一门技术出现必定是有原因的,一来是解决某方面技术问题,再者可能是优化性能。

xmlDom 简单方便,可以将xml文档以"DOM树"的形式装进内存,节点对象操作元素。但xml数据量较大时,消耗内存也大。sax访问元素方便,不能对元素crud。都是有明显缺点的。

Dom4j的出现,正好优化了xml解析。

Dom4j和xmlDom 从操作上看很相似,可以说只是对应的API不一样。

值得注意的是:

DOM4J不是sun公司自己的产品,所以没有提供服务的jar包,我们可以自己下载DOM4J-API包,里面有API(index-html),jar包等。

二 DOM4J怎么用

准备好示例xml

<?xml version="1.0" encoding="UTF-8"?>

<class>
<stu id="SP001">
<name>小刘</name>
<age>12</age>
<Math>100</Math>
<English>90</English>
</stu>
<stu id="sp002">
<name>小明</name>
<age>12</age>
<Math>98</Math>
<English>90</English>
</stu>
<stu id="sp003">
<name>小张</name>
<age>12</age>
<Math>83</Math>
<English>91</English>
</stu>
</class>


(1)访问元素

Element e= document.getRootElement().Element('stu');
Element nameNode= (Element) e.elements("name").get(0); //等价于e.Element('name');
System.out.println( nameNode.getText());//小明


(2)插入元素

Element stuEle=DocumentHelper.createElement("stu");
stuEle.addAttribute("id", "sp003"); //添加属性(id)
Element nameEle=DocumentHelper.createElement("name");
nameEle.setText("宋江");
Element ageEle=DocumentHelper.createElement("age");
ageEle.setText("11");
Element MathEle=DocumentHelper.createElement("Math");
MathEle.setText("100");
//将元素挂到stu上
stuEle.add(nameEle);
stuEle.add(ageEle);
stuEle.add(MathEle);
//刷新,这很重要。


(3)修改

(4)删除

FIND:访问属性时: node.Elements('NodeName'); 里面的元素只能是node的直接子节点,不可以是孙子(包括以后)。也不能根据id,name属性来访问元素。

那么为提高查询效率,需要借助xpath;

三:xpath怎么配合DOM4J

(1)什么是xpath

xpath操作xml有点像sql语言查询数据库的效果,简单的说,xpath是一种查询格式。

示例xml

<?xml version="1.0" encoding="UTF-8"?>
<AAA>
<BBB id="sp001">B1</BBB>
<BBB id="sp002" name="Bbb">
<CCC>C1</CCC>
<AAA>
<BBB>B2</BBB>
</AAA>
<BBB>B3</BBB>
</BBB>

</AAA>


  看下面xpath配合DOM4j------注意xpath不单独使用

List list=doc.selectNodes("/AAA/BBB");    //  "/AAA/BBB"就是xpath格式
System.out.println(list.size()); //2;

//(1)xpath最经典的用法一
Element list1= (Element)doc.selectSingleNode("/AAA/BBB[1]");
// 拿到属性和Text
System.out.println("id||"+list1.attributeValue("id"));
System.out.println("TextContent||"+list1.getText());

// (2)经典用法二
//通过id,name属性选出元素,相等于getElementById("ID");getElementsByTagName()
//取出id=‘sp001’的BBB元素;
Element node= (Element)(doc.selectNodes("//BBB[@id='sp001']").get(0));
System.out.println(node.getText()); //B1;
//取出name属性为"Bbb"的BBB元素
Element n= (Element) doc.selectSingleNode("//BBB[@name='Bbb'][1]");
System.out.println(n.attributeCount()); //2


  

xpath细节:

(1) "/AAA/BBB"-----AAA下的BBB集合(只是子节点), /有点路径的意思。

再者:"/AAA/BBB[1]"----就是具体指第1个BBB元素(这里的1不是index=0开始的,就是实际上的1).

(2) "//AAA"-----指的是xml中全部AAA元素;

比如:"//AAA/BBB"---父元素是AAA的全部BBB元素集合(List)

(3) "//BBB[@id='sp001']"-----取出id=‘sp001’的BBB元素集合(List)

"//BBB[@name="Bbb"]"-----取出name="Bbb"的元素集合(List)

"//BBB[@id='sp001'][1]''----取出第1个元素

find: 通过xpath的修饰,DOM4J的查询功能就很强大了。适用于大多数情况,一般解析xml文档都是使用它。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: