在以前自己使用的xml较少,只是了解其很强大,现在可算是在DRP中,真正的开始使用它了,以前只是简单的理解xml,xml即可扩展标记语言,简单的使用,具体是什么?怎么用?还是一直让自己期待的.

首先来看一下xml的强大的作用

一、兼容现有协议

    XML文档格式的管理信息可以很容易地通过HTTP 协议传输,由于HTTP是建立在TCP之上的,故管理数据能够可靠传输。XML还支持访问XML文档的标准API,如DOM,SAX,XSLT,Xpath等。


二、统一的管理数据存取格式

    XML能够以灵活有效的方式定义管理信息的结构。以XML格式存储的数据不仅有良好的内在结构,而且由于它是W3C提出的国际标准,因而受到广大软件提供商的支持,易于进行数据交流和开发。现有网络管理标准如TMN、SNMP等的管理信息库规范决定了网管数据符合层次结构和面向对象原则,这使得以XML格式存储网管数据也非常自然,易于实现。




三、不同应用系统间数据的共享和交互

    只要定义一套描述各项管理数据和管理功能的XML语言,用Schema对这套语言进行规定,并且共享这些数据的系统的XML文档遵从这些Schema,那么管理数据和管理功能就可以在多个应用系统之间共享和交互。


四、底层传输的数据更具可读性

    网络中传输的底层数据因协议不同而编码规则不同,虽然最终传输时都是二进制位流,但是不同的应用协议需要提供不同的转换机制。这种情况导致管理站在对采用不同协议发送管理信息的被管对象之间进行管理时很难实现兼容。如果协议在数据表示时都采用XML格式进行描述,这样网络之间传递的都是简单的字符流,可以通过相同的XML解析器进行解析,然后根据不同的XML标记,对数据的不同部分进行区分处理,使底层数据更具可读性。[4]

五、它和json都是一种数据交换格式

在不同的数据库与系统间的交互,数据的相互共享其解决了很大的问题,不同语言开发的系统也可以使用xml来共享数据;



    xml可以当然数据库的表,来存储数据,因为其都有一定的结构,结点,分层次的,很有规律,这样我们以前来回传递数据可以借鉴xml来实现……





    既然xml的作用这么重要,如何解析xml、数据库的数据取出来生成xml,这是首要解决的问题,结合在DRP中,为了实现数据库的地址、用户名、密码都是灵活的通过xml来获取,显然系统后期的维护与修改显得很轻松。

Dom4j是什么?

Dom4j是一个易于使用的,开源的库,在Java平台上与XML,XPath,XSLT协同工作。使用Java集合框架,全面支持DOM,SAX,JAXP。

dom4j是一个Java的XMLAPI,类似于jdom,用来读写XML文件的。dom4j是一个非常非常优秀的JavaXMLAPI,具有性能优异、功能强大和极端易用使用的特点,同时它也是一个开放源代码的软件,可以在SourceForge上找到它。

Dom4j实例解析XML

要读取解析的xml文件:sys-config.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <config>
  3. <db-info>
  4. <driver-name>oracle.jdbc.driver.OracleDriver</driver-name>
  5.  
  6. <url>jdbc:oracle:thin:@127.0.0.1:1521:ORCL</url>
  7. <user-name>sys</user-name>
  8. <password>sys</password>
  9. </db-info>
  10. </config>

读取xml文件的类:XmlConfigReader.java

读写XML文档主要依赖于org.dom4j.io包,其中提供DOMReader和SAXReader两类不同方式,而调用方式是一样的。这就是依靠接口的好处。

  1. import java.io.InputStream;
  2.  
  3. //引用相应的包
  4.  
  5. import org.dom4j.Document;
  6. import org.dom4j.DocumentException;
  7. import org.dom4j.Element;
  8. import org.dom4j.io.SAXReader;

读取xml的java类:XmlConfigReader

代码中reader的read方法是重载的,可以通过InputStream, File, Url等不同的参数来读取,通过单例模式生成一个对象,这个对象实例化一个SAXReader,然后将xml文件加载到流当中。再通过SAXReader的read()方法将其转换成一个document对象。然后通过这个document对象取到xml文件的节点的值。

  1. package conn.lishehe.drp.util;
  2.  
  3. import java.io.InputStream;
  4.  
  5. //引用相应的包
  6.  
  7. import org.dom4j.Document;
  8. import org.dom4j.DocumentException;
  9. import org.dom4j.Element;
  10. import org.dom4j.io.SAXReader;
  11.  
  12. public class XmlConfigReader {
  13. //懒汉式
  14. private static XmlConfigReader instance = null;
  15. //保存jdbc相关配置信息的
  16. private JdbcConfig jdbcConfig = new JdbcConfig();
  17.  
  18. private XmlConfigReader(){
  19. //建立一个SAXReader对象
  20. SAXReader reader = new SAXReader();
  21. //通过当前线程的类加载器,获得文件的相对路径,读入缓冲输入流
  22. InputStream in = Thread.currentThread().getContextClassLoader().getResourceAsStream("sys-config.xml");
  23. try {
  24. //取得jdbc相关配置信息
  25. //通过流来读取xml文件
  26. Document doc = reader.read(in);
  27. //读取jdbc相关信息
  28. //Element:用于描述XML文档中的元素。
  29. Element driverNameElt = (Element)doc.selectObject("/config/db-info/driver-name");
  30. Element urlElt = (Element)doc.selectObject("/config/db-info/url");
  31. Element userNameElt = (Element)doc.selectObject("/config/db-info/user-name");
  32. Element passwordElt = (Element)doc.selectObject("/config/db-info/password");
  33.  
  34. /*String driverName = driverNameElt.getStringValue();
  35. String url = urlElt.getStringValue();
  36. String userName = userNameElt.getStringValue();
  37. @SuppressWarnings("unused")
  38. String password = passwordElt.getStringValue();
  39.  
  40. System.out.println(driverName);*/
  41.  
  42. //取得jdbc相关的配置
  43. jdbcConfig.setDriverName(driverNameElt.getStringValue());
  44. jdbcConfig.setUrl(urlElt.getStringValue());
  45. jdbcConfig.setUserName(userNameElt.getStringValue());
  46. jdbcConfig.setPassword(passwordElt.getStringValue());
  47.  
  48. } catch (DocumentException e) {
  49. // TODO Auto-generated catch block
  50. e.printStackTrace();
  51. }
  52. }
  53. public static synchronized XmlConfigReader getInstance(){
  54. if(instance == null){
  55. instance = new XmlConfigReader();
  56.  
  57. }
  58. return instance;
  59.  
  60. }
  61. /**
  62. * 返回jdbc相关配置
  63. * @return
  64. */
  65. public JdbcConfig getJdbcConfig(){
  66. return jdbcConfig;
  67. }
  68.  
  69. public static void main(String[] args){
  70.  
  71. JdbcConfig jdbcConfig = XmlConfigReader.getInstance().getJdbcConfig();
  72. /*System.out.println(jdbcConfig.getDriverName());
  73. System.out.println(jdbcConfig.getUrl());
  74. System.out.println(jdbcConfig.getUserName());*/
  75. System.out.println(jdbcConfig);
  76. }
  77. }

定义的实体集的类:JdbcConfig.java

  1. package conn.lishehe.drp.util;
  2. /**
  3. * Jdbc
  4. * @author lishe
  5. *
  6. */
  7. public class JdbcConfig {
  8.  
  9. private String driverName;
  10. public String getDriverName() {
  11. return driverName;
  12. }
  13. public void setDriverName(String driverName) {
  14. this.driverName = driverName;
  15. }
  16. public String getUrl() {
  17. return url;
  18. }
  19. public void setUrl(String url) {
  20. this.url = url;
  21. }
  22. public String getUserName() {
  23. return userName;
  24. }
  25. public void setUserName(String userName) {
  26. this.userName = userName;
  27. }
  28. public String getPassword() {
  29. return password;
  30. }
  31. public void setPassword(String password) {
  32. this.password = password;
  33. }
  34. private String url;
  35. private String userName;
  36. private String password;
  37. @Override
  38. public String toString() {
  39. return this.getClass().getCanonicalName() + "{driverName:" + driverName + ", url:" + url + ", userName:" + userName + "}";
  40. }
  41.  
  42. }

数据处理层:DbUtil.java

  1. package conn.lishehe.drp.util;
  2.  
  3. import java.sql.Connection;
  4. import java.sql.DriverManager;
  5.  
  6. /**
  7. * 封装数据库常用操作
  8. * @author 李社河
  9. */
  10. public class DbUtil {
  11. /**
  12. * 取得Connection
  13. * @return
  14. * @throws ClassNotFoundException
  15. */
  16. public static Connection getConnection() throws ClassNotFoundException{
  17. /* Connection conn = null;
  18. try {
  19. Class.forName("oracle.jdbc.driver.OracleDriver");
  20. String url = "jdbc:oracle:thin:@127.0.0.1:1521:ORCL";
  21. String username = "";
  22. String password = "";
  23. conn = DriverManager.getConnection(url, username,password);
  24.  
  25. } catch (Exception e) {
  26. // TODO Auto-generated catch block
  27. e.printStackTrace();
  28. }
  29. return conn;*/
  30. Connection conn = null;
  31. try {
  32. JdbcConfig jdbcConfig = XmlConfigReader.getInstance().getJdbcConfig();
  33. Class.forName(jdbcConfig.getDriverName());
  34.  
  35. conn = DriverManager.getConnection(jdbcConfig.getUrl(), jdbcConfig.getUserName(),jdbcConfig.getPassword());
  36.  
  37. } catch (Exception e) {
  38. // TODO Auto-generated catch block
  39. e.printStackTrace();
  40. }
  41. return conn;
  42.  
  43. }
  44. public static void main(String[] args){
  45. try {
  46. //测试获取到相应的配置文件的信息,打出来
  47. System.out.println(DbUtil.getConnection());
  48. } catch (ClassNotFoundException e) {
  49. // TODO Auto-generated catch block
  50. e.printStackTrace();
  51. }
  52. }
  53.  
  54. }
执行结果:


当然另外值得一提的是DOM4J对XPath有良好的支持,如访问一个节点,可直接用XPath选择:

  1. //Element:用于描述XML文档中的元素。
  2. Element driverNameElt = (Element)doc.selectObject("/config/db-info/driver-name");
  3. Element urlElt = (Element)doc.selectObject("/config/db-info/url");

这里使用的是selectObject方法,此方法返回找到的第一个匹配节点,如果没有匹配的节点就返回 null。XPath更像一种选择器,只要你给出条件即可。

总结

通过以上的一些方法,我们可以得到XML整个文档、文档的根节点、符合某个条件的所有节点以及单独拿到某个节点,都是可以的,这样xml带给系统的灵活性是非常强大的,Dom4j使得Java读取XML文件更加的方便,更加的快捷,效率更高,联系到项目中可以把相应的页面信息在数据库的地址,读取成xml文件,在权限的基础上来判定加载相应的结点,生产相应的权限树是不错的选择啊……这样联系想起来又勾起了我做项目的冲动哈!

深入浅出Java Dom4j读取XML的更多相关文章

  1. Java DOM4J读取XML

    DOM4J是dom4j.org出品的一个开源XML解析包.Dom4j是一个易用的.开源的库,用于XML,XPath和XSLT.它应用于Java平台,採用了Java集合框架并全然支持DOM,SAX和JA ...

  2. java DOM4J 读取XML

    最近学习Java,在处理XML文档的时候,查阅相关资料,发现了DOM4J这个jre库,相对C#的XML处理来说,功能还算是跟得上 下面展示一篇我自己写的一个XML读取测试 import java.ut ...

  3. Java使用dom4j读取xml时报错:org.dom4j.DocumentException: Error on line 2 of document : Invalid byte 2 of 2-byte UTF-8 sequence. Nested exception: Invalid byte 2 of 2-byte UTF-8 sequence

    1.Java使用dom4j读取xml时报错: org.dom4j.DocumentException: Error on line 2 of document  : Invalid byte 2 of ...

  4. RSS阅读器(一)——dom4j读取xml(opml)文件

    接触java不久,偶有收获,最近想做一个web版RSS阅读器来锻炼一下.手头有几个从不同版本的foxmail中导出的opml文件,大家应该都知道,opml文件就是xml格式的.那么就先从这里入手,练习 ...

  5. 使用dom4j 读取XML文件

    第一次接触dom4j的时候,感觉这个东西很神秘,因为之前虽然知道XML文件吧,但从来没有用过,一直感觉XML肯定不好操作.当得知,dom4j可以很容易的操作读取XML文件时,不免有些好奇,那么,用do ...

  6. DOM4J读取XML文件

    最近在做DRP的项目,其中涉及到了读取配置文件,用到了DOM4J,由于是刚开始接触这种读取xml文件的技术,好奇心是难免的,于是在网上又找了一些资料,这里就结合找到的资料来谈一下读取xml文件的4中方 ...

  7. java Domj4读取xml文件

    先概括,再以代码形式给出. 获取节点: Iterator  Element.nodeIterator();  //获取当前标签节点下的所有子节点 获取 标签: Element Document.get ...

  8. 【XML】利用Dom4j读取XML文档以及写入XML文档

    Dom4j简介 dom4j是一个Java的XML API,是jdom的升级品,用来读写XML文件的.dom4j是一个十分优秀的JavaXML API,具有性能优异.功能强大和极其易使用的特点,它的性能 ...

  9. 使用dom4j读取xml连接数据库与之单例模式

    使用dom4j读取xml ,加入jar包 dom4j-1.6.1.jar jaxen-1.1-beta-6.jar public class XmlConfigReader { //懒汉式,延迟加载 ...

随机推荐

  1. ubuntu 系统应用安装方式

    转载   ubuntu系统软件安装 来源:http://www.linuxidc.com/Linux/2011-02/32211.htm 首先说明一下 ubuntu 的软件安装大概有几种方式:1. d ...

  2. RabbitMQ-Spring AMQP

    上篇文章RabbitMQ基础入门学习了rabbitMQ一些基础的api,当然spring也在原生代码的基础上做了更多的封装,这篇文章就基于spring-rabbit,学习一下spring的实现. p. ...

  3. Mysql优化--Show Profile

    Mysql 系列文章主页 =============== 是Mysql提供可以用来分析当前会话中语句执行的资源消耗情况.可以用于Sql的调优的测量.默认情况下处于关闭状态,并保存最近 15 次的运行结 ...

  4. MockHttpServletRequestBuilder中content和param的区别

    结论: Mock将URL的参数和通过使用param添加的参数添加到request中的parameter中(url参数) 而将content内容.类型并没有进行解析,直接添加到request的conte ...

  5. JVM Class详解之一

    首先看Class中包含哪些信息简单的说所有Java文件中有的信息class文件都有,编译器帮我们将java文件转化成了JVM能看懂的class格式而已 Class 概述 Class文件是一组以8位字节 ...

  6. 3.2 2-dim Vector Initialization

    声明3行4列的数组 const int m = 3, n = 4; vector<vector<int> > A(m); // 3 rows for(int i = 0; i ...

  7. ORACLE设置自启动记录

    设置开机自启动1. 修改Oracle系统配置文件:/etc/oratab,只有这样,Oracle 自带的dbstart和dbshut才能够发挥作用.[root@hailiang ~]# vi /etc ...

  8. eclipse安装和配置Gradle插件

    配置: 首先下载Gradle:https://gradle.org/gradle-download/ 设置Gradle环境变量: GRADLE_HOME %GRADLE_HOME%\bin" ...

  9. Minimize the error CodeForces - 960B

    You are given two arrays A and B, each of size n. The error, E, between these two arrays is defined  ...

  10. Docker基本架构

    Docker 采用了 C/S架构,包括客户端和服务端. Docker daemon 作为服务端接受来自客户的请求,并处理这些请求(创建.运行.分发容器). 客户端和服务端既可以运行在一个机器上,也可通 ...