dom4j创建、解析xml以及应用xpath查询元素

xml的两种解析原理

xml解析方式分为两种: DOM(Document Object Model)和SAX(Simple API for XML),

首相说明,这两种方式不是针对Java的xml解析技术,而是跨语言的解析方式,比如:JavaScript中就有dom解析技术。

DOM解析原理

dom解析方式的原理:要求解析器把整个xml文档装载进一个document对象之中,该对象中包含文档元素和所有的xml中的元素。

这种解析方式的优点和缺点:

优点是:xml解析之后,整个文档的结构和关系,清晰的存在于内存之中。

缺点是:把整个文档都读入内存,如果文档内容过大,将会导致内存溢出,浪费内存。

sax解析原理

sax解析方式的原理:sax解析和dom解析是一样的,都是一行一行的读取文件的内容,但是dom是最终将整个文档都放入document ,而sax是,不会保存任何数据,也就是说,sax读取本行内容的时候,会返回当前的对象,但是上一行查询不到,当解析完整个xml的时候,sax工作也就结束了。

优点:使用sax解析xml文档,不会占用很多内存,速度快,效率高

缺点:不能完整的保存整个文档对象以及他们之间的关系,无法进行一些增删改的操作,但是如果仅仅要查询xml中的元素,sax是一个不错的选择。

dom4j解析技术

1.dom4j的定义

       dom4j是一种针对Java开发的xml解析技术,不想dom技术是跨语言的。dom4j综合了dom技术和sax解析技术。

2.dom4j的类结构图:

    dom4j结构类图

这里与JavaScript的dom解释的方式还是有一些区别的,在这里看到attribute还是一个节点,但是在JavaScript中,属性已经不是节点了,要记住。

Branch是可以有子节点的节点,

3.dom4j创建xml文档
3.1创建xml文档对象

Document doc = DocumentHelper.createDocument();

3.2.创建根节点

1.首先创建一个元素节点

       Elementroot = DocumentHelper.createElement (“root”);

2.将这个元素节点,添加到根节点位置

       doc.setRootElement(root);

3.3.给元素添加属性

public Element addAttribute(Stringname,String value);

name:是指定属性名

value:指定属性值

代码;

给根元素添加属性:

       root.addAttribute(“id”,”1”);

3.4.创建子元素

public Element addElement(String name);

name:指定子节点的名称

代码:

给根元素添加子元素book

Element book=root.addElement(“book”);

3.5.给元素节点添加文本节点

public void setText(Stringtext);------------将普通文本作为节点内容

public void addCDATA(String data)--------将CDATA段作为节点内容

代码;

给book节点设置文本

book.setText(“图书”);

给book设置CDATA

book.addCDATA(“小王子&鲁滨孙漂流记”);

3.6.添加注释

public Element addComment(Stirng comment);

comment:指定注释内容

代码

给book节点,添加注释

book.addComment(“这里是介绍一本书”)

3.7.输出xml到硬盘,并且设置格式和编码

输入xml的类:

       XMLWriterwriter = new XMLWriter (output,format);

      

output:指定输出流和输出到的文件。

format:设置输出格式---是OutputFormat格式的。

                     OutputFormat类常用的方法:

public static OutputFormat createPrettyprint();----设置有缩进的xml文档, 不然的话就会是没有缩进的,很难看

public void setEncoding(String encoding)------设置编码集

       代码

       输入document到aaa.xml上面

       StringfileUrl = “aaa.xml”;

       OutputFormatformat = OutputFormat. createPrettyprint();

       format.setEncoding(“utf-8”);

       XMLWriterwriter = new XMLWriter(new FileWriter(fileUrl),format);

       writer.write(doc);

       writer.close();

3.8.一个完整的实例

       publicclass CreateXml {

       publicstatic void main(String[] args) throws Exception {

              Documentdocument = DocumentHelper.createDocument();

              Elementroot = document.addElement("book");

              document.setRootElement(root);

              root.addComment("这是一个描写书的xml");

              Elementbname = root.addElement("bname");

              bname.addComment("这是书名");

              bname.addAttribute("id","1");

              bname.setText("linux从入门到精通");

              Elementbauthor = root.addElement("bauthor");

              bname.addAttribute("id","2");

              OutputFormatformat = OutputFormat.createPrettyPrint();

              format.setEncoding("utf-8");

              XMLWriterxmlWriter = new XMLWriter(new FileOutputStream(new File("src/b1.xml")),format);

              xmlWriter.write(document);

xmlWriter.close();

       }

}

结果:

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

 

<book>

 <!--这是一个描写书的xml-->

 <bname id="2">

   <!--这是书名-->linux从入门到精通

 </bname>

 <bauthor/>

</book>

 

4.解析xml文档
4.1.创建解析器

SAXReader reader = new SAXReader();

4.2.构建xml文档对象

解析器对象,有一个read方法,就可以创建文本对象

public Document read(File file) throwsDocuemtException

file:用于指定要解析的xml文件。

String fileUrl =“aaa.xml”;

       Documentdoc = reader.read(new File(fileUrl));

4.3.获取根节点

public Element getRootElement();

返回值:根节点对象,Element类型

代码;

获取根节点

Element root = doc. getRootElement();

4.4.获取子节点

1.获取元素节点中的第一个指定名称的子元素节点

       publicElement element(String name);

       name:用于指定获取子节点的名字

       代码:

       返回根节点中名字为book的子元素节点

       Elementbook = root.element(“book”);

2.获取元素节点中的所有指定名字的子元素节点

       public List elements(Stringname);

       name:指定的元素的名字

       返回值:list集合

       代码:

       返回根节点中名字为book的所有子元素节点

       List<Element>books= root.elements(“book”);

4.5.删除元素节点的属性,文本,和子节点

remove(Element ele);----------删除指定的子元素节点

remove(Attribute att);----------删除元素的属性

remove(Text text);-------------删除元素的文本

5.dom4j对xpath的支持
5.1.xpath是什么:

       XPath即为XML路径语言(XML Path Language),它是一种用来确定XML文档中某部分位置的语言。xpath使用路径表达式来选取文档中的节点或者节点集,注意xpath是把xml文档中的属性,元素,文本,注释,等都封装成了节点对象,请参照上面的图,对nodes操作。使用路径的方式来进行操作。

5.2.dom4j中xpath的使用

在DOM4J中,Node接口中的三个方法最为常用: 

l  List selectNodes(String xpathExpression):在当前节点中查找满足XPath表达式的所有子节点;

l  Node selectSingleNode(String xpathExpression):在当前节点中查找满足XPath表达式的第一个子节点;

l  String valueOf(String xpathExpression):在当前节点中查找满足XPath表达式的第一个子节点的文本内容;

5.2.1常见的xpath表达式的写法:

* 可以直接获取到某个元素

 

       *第一种形式

              /AAA/DDD/BBB:表示一层一层的,AAA下面 DDD下面的BBB

       *第二种形式

              //BBB:表示和这个名称相同,表示只要名称是BBB,都得到

       *第三种形式

              /*:所有元素

       *第四种形式

              ** BBB[1]: 表示第一个BBB元素

              ×× BBB[last()]:表示最后一个BBB元素

       *第五种形式

              **//BBB[@id]: 表示只要BBB元素上面有id属性,都得到

       *第六种形式

              **//BBB[@id='b1'] 表示元素名称是BBB,在BBB上面有id属性,并且id的属性值是b1

5.2.2.xpath的具体操作

       **默认的情况下,dom4j不支持xpath

       **如果想要在dom4j里面是有xpath

              *第一步需要,引入支持xpath的jar包,使用 jaxen-1.1-beta-6.jar

              **需要把jar包导入到项目中

       **使用xpath实现:查询xml中所有name元素的值

              **所有name元素的xpath表示: //name

              **使用selectNodes("//name");

              **代码和步骤

              /*

               * 1、得到document

               * 2、直接使用selectNodes("//name")方法得到所有的name元素

               *

               * */

                     //得到document

                     Documentdocument = Dom4jUtils.getDocument(Dom4jUtils.PATH);

                     //使用selectNodes("//name")方法得到所有的name元素

                     List<Node>list = document.selectNodes("//name");

                     //遍历list集合

                     for(Node node : list) {

                            //node是每一个name元素

                            //得到name元素里面的值

                            Strings = node.getText();

                            System.out.println(s);

                     }

      

       **使用xpath实现:获取第一个p1下面的name的值

              *//p1[@id1='aaaa']/name

              *使用到selectSingleNode("//p1[@id1='aaaa']/name")

              *步骤和代码

              /*

               * 1、得到document

               * 2、直接使用selectSingleNode方法实现

               *   -xpath : //p1[@id1='aaaa']/name

               * */

              //得到document

              Documentdocument = Dom4jUtils.getDocument(Dom4jUtils.PATH);

              //直接使用selectSingleNode方法实现

              Nodename1 = document.selectSingleNode("//p1[@id1='aaaa']/name"); //name的元素

              //得到name里面的值

              Strings1 = name1.getText();

              System.out.println(s1);


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值