在以前自己使用的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

<?xml version="1.0" encoding="UTF-8"?>
<config>
<db-info>
<driver-name>oracle.jdbc.driver.OracleDriver</driver-name> <url>jdbc:oracle:thin:@127.0.0.1:1521:ORCL</url>
<user-name>sys</user-name>
<password>sys</password>
</db-info>
</config>

读取xml文件的类:XmlConfigReader.java

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

import java.io.InputStream;

//引用相应的包

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

读取xml的java类:XmlConfigReader

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

package conn.lishehe.drp.util;

import java.io.InputStream;

//引用相应的包

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader; public class XmlConfigReader {
//懒汉式
private static XmlConfigReader instance = null;
//保存jdbc相关配置信息的
private JdbcConfig jdbcConfig = new JdbcConfig(); private XmlConfigReader(){
//建立一个SAXReader对象
SAXReader reader = new SAXReader();
//通过当前线程的类加载器,获得文件的相对路径,读入缓冲输入流
InputStream in = Thread.currentThread().getContextClassLoader().getResourceAsStream("sys-config.xml");
try {
//取得jdbc相关配置信息
//通过流来读取xml文件
Document doc = reader.read(in);
//读取jdbc相关信息
//Element:用于描述XML文档中的元素。
Element driverNameElt = (Element)doc.selectObject("/config/db-info/driver-name");
Element urlElt = (Element)doc.selectObject("/config/db-info/url");
Element userNameElt = (Element)doc.selectObject("/config/db-info/user-name");
Element passwordElt = (Element)doc.selectObject("/config/db-info/password"); /*String driverName = driverNameElt.getStringValue();
String url = urlElt.getStringValue();
String userName = userNameElt.getStringValue();
@SuppressWarnings("unused")
String password = passwordElt.getStringValue(); System.out.println(driverName);*/ //取得jdbc相关的配置
jdbcConfig.setDriverName(driverNameElt.getStringValue());
jdbcConfig.setUrl(urlElt.getStringValue());
jdbcConfig.setUserName(userNameElt.getStringValue());
jdbcConfig.setPassword(passwordElt.getStringValue()); } catch (DocumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static synchronized XmlConfigReader getInstance(){
if(instance == null){
instance = new XmlConfigReader(); }
return instance; }
/**
* 返回jdbc相关配置
* @return
*/
public JdbcConfig getJdbcConfig(){
return jdbcConfig;
} public static void main(String[] args){ JdbcConfig jdbcConfig = XmlConfigReader.getInstance().getJdbcConfig();
/*System.out.println(jdbcConfig.getDriverName());
System.out.println(jdbcConfig.getUrl());
System.out.println(jdbcConfig.getUserName());*/
System.out.println(jdbcConfig);
}
}

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

package conn.lishehe.drp.util;
/**
* Jdbc
* @author lishe
*
*/
public class JdbcConfig { private String driverName;
public String getDriverName() {
return driverName;
}
public void setDriverName(String driverName) {
this.driverName = driverName;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
private String url;
private String userName;
private String password;
@Override
public String toString() {
return this.getClass().getCanonicalName() + "{driverName:" + driverName + ", url:" + url + ", userName:" + userName + "}";
} }

数据处理层:DbUtil.java

package conn.lishehe.drp.util;

import java.sql.Connection;
import java.sql.DriverManager; /**
* 封装数据库常用操作
* @author 李社河
*/
public class DbUtil {
/**
* 取得Connection
* @return
* @throws ClassNotFoundException
*/
public static Connection getConnection() throws ClassNotFoundException{
/* Connection conn = null;
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
String url = "jdbc:oracle:thin:@127.0.0.1:1521:ORCL";
String username = "";
String password = "";
conn = DriverManager.getConnection(url, username,password); } catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return conn;*/
Connection conn = null;
try {
JdbcConfig jdbcConfig = XmlConfigReader.getInstance().getJdbcConfig();
Class.forName(jdbcConfig.getDriverName()); conn = DriverManager.getConnection(jdbcConfig.getUrl(), jdbcConfig.getUserName(),jdbcConfig.getPassword()); } catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return conn; }
public static void main(String[] args){
try {
//测试获取到相应的配置文件的信息,打出来
System.out.println(DbUtil.getConnection());
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} }
执行结果:


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

//Element:用于描述XML文档中的元素。
Element driverNameElt = (Element)doc.selectObject("/config/db-info/driver-name");
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. Win7删除文件夹提示找不到该项目无法删除

    在使用win7操作系统的过程中,有一些朋友会遇到这种情况,因为某种不明原因,硬盘里面某一个文件夹无法删除,表现为在删除的时候,系统提示找不到该项目,即找不到该文件夹,就像它变成了幽灵一样,看得到却摸不 ...

  2. C语言程序设计第三次作业 —— 选择结构(1)

    (一)改错题 计算f(x)的值:输入实数x,计算并输出下列分段函数f(x)的值,输出时保留1位小数. (错误一) 错误原因及改正:第九行语句结尾缺少半角分号,添加分号即可改正 (错误二) 错误原因及改 ...

  3. Go 实现字符串相似度计算函数 Levenshtein 和 SimilarText

    [转]http://www.syyong.com/Go/Go-implements-the-string-similarity-calculation-function-Levenshtein-and ...

  4. 最新版-MySQL8.0 安装 - 改密码 之坑

    1. 需求背景 最近需要在一台性能一般的电脑上使用数据库,所以决定安装MySQL数据库,以前安装都是使用WorkBench自动化安装,但安装过程太慢占用空间过大,于是下载zip压缩包.之所以选择选择M ...

  5. Ajax来实现下拉框省市区三级联动效果(服务端基于express)

    //服务端JS代码: //提供服务端的处理 const express = require('express'); const fs = require('fs'); const app = expr ...

  6. textarea不能使用maxlength

    知道文本框有个maxlength属性,有次开发项目中使用了textarea标签,没去看文档,直接加了maxlength属性,且有效果没有报错,喜滋滋的用了,结果没两天就测试出了bug 问题描述:文本域 ...

  7. 开源Spring解决方案--lm.solution

    Github 项目地址: https://github.com/liumeng0403/lm.solution 一.说明 1.本项目未按java项目传统命名方式命名项目名,包名 如:org.xxxx. ...

  8. JQuery 分页显示jquery-pager-1.0.js

    原版是jquery-pager-1.0.js,经过变更修改加上按照项目中的一些需要修改过来. //初始化分页控件 PagerOptions为配置参数 url为要提交的url地址,如果不需要提交则可以为 ...

  9. 将Python当作计算器

    在交互模式中,最近一个表达式的值赋给变量 _.这样我们就可以把它当作一个桌面计算器,很方便的用于连续计算.例如: >>> price = 1.25 #声明变量price >&g ...

  10. MLDS笔记:Optimization

    当函数空间覆盖到目标函数时,如何通过优化调整神经网络的参数找到这个目标函数呢? 深度学习中的损失函数是非凸的,非凸优化是个NP-hard问题,如何通过梯度下降来解决这个问题呢? 注意,不同于learn ...