XML及jdom解析

可扩展标记语言(eXtensible Markup Language)
一、三个概念
    XMl 可扩展标记语言
    XSL 展现事务的表现形式
    DTD 约束XML文件中是什么
二、简单例子(橡皮泥)
DTD :你叫橡皮泥,可以有颜色、产地的属性
XML :<橡皮泥 颜色=“白色”>
          <产地>
              东海傲来国
          </产地>
      </橡皮泥>
XSL: 装饰文件(一样的数据不一样的装饰)
      第一种捏法----小猫
      第二种捏法----小狗
现在DTD用的较少了,现在使用较多的是Schema
现在的标准主要是W3C制定。

三、WHY XML?
html缺点:标签不可扩展,数据和显示风格没有分离。

四、XML使用最多的是
A、配置文件
B、数据交换(异质信息交换)
C、有利于爬虫等网络技术

五、命名空间
下例中policeman 007name的命名空间采用了缺省的方式,而血刀老祖name采用了以X为开头的命名空间。

“xmlns:X="http://www.police.net/criminal.dtd"”所以两个name区分开了。

<?xml version="1.0" encoding="gb2312" ?>
- <policeman xmlns="http://www.police.net/policeman.dtd"

xmlns:X="http://www.police.net/criminal.dtd">
  <name>007</name>
- <X:criminal>
  <X:name>血刀老祖</X:name>
  </X:criminal>
  </policeman>

六、处理指示
<?              ?>

七、设计原则
以下属性可以设计成元素
如果属性包含子结构
如果该熟性发生次数是多次的
比较重要、DTD需要限制

八、解析
jdom 、dom4j、sax

下面采用jdom进行解析,因为比较简单。

 

九、具体示例

1、gobal-configure.xml

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

<sys-configure>
	<jdbc-info>
		<driver-class-name>com.mysql.jdbc.Driver</driver-class-name>
	    <url>jdbc:mysql://10.60.40.201:3306/futures3</url>	
		<user-name>root</user-name>	
		<password>symbio</password>	
		<beans>	
			<bean id="categoryBourse" class="com.symbio.hz.dataload.CategoryBourse"></bean>
			<bean id="categoryTradeMonth" class="com.symbio.hz.dataload.CategoryTradeMonth"></bean>
		</beans>>
	</jdbc-info>
</sys-configure>

  

 2、DBManager

package com.hz.data;
public class CategoryBourse {
}
 
public class DBManager {
 private String dbDriver_;
 private String dbUrl_;
 private String dbLogin_;
 private String dbPassword_;
 public String getDbUrl_() {
  return dbUrl_;
 }
 public void setDbUrl_(String dbUrl_) {
  this.dbUrl_ = dbUrl_;
 }
 public String getDbLogin_() {
  return dbLogin_;
 }
 public void setDbLogin_(String dbLogin_) {
  this.dbLogin_ = dbLogin_;
 }
 public String getDbPassword_() {
  return dbPassword_;
 }
 public void setDbPassword_(String dbPassword_) {
  this.dbPassword_ = dbPassword_;
 }
 public void setDbDriver_(String dbDriver_) {
  this.dbDriver_ = dbDriver_;
 }
}

 

 

 3、Globleconfigue.java

package hz.data;

import java.io.IOException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import org.jdom.Document;
import org.jdom.Element;
import org.jdom.JDOMException;
import org.jdom.input.SAXBuilder;
import org.jdom.xpath.XPath;

/**
 * 读取xml格式的配置文件
 * 
 */
public class Globleconfigue {
	//定义一个需要处理的xml常量。
	private static final String CONFIG_FILE_NAME="gobal-configure.xml";
	//定义根元素
	private Element rootElt;
	//数据库连接属性类DBManager
	private DBManager dbManager= new DBManager();
	public DBManager getDbManager() {
		return dbManager;
	}
	//用来存放下面initBeans();方法中获得的bean
	private Map beanMap= new HashMap();
	
	//定义一个单例模式。
	private static Globleconfigue instance = new Globleconfigue();

	private Globleconfigue(){
		//先生成一个SAXBuilder对象,该对象是dom的内部对象。
		SAXBuilder sb=new SAXBuilder();
		try {
		// sb.build(in)    SAXBuilder的对象sb根据文件输入流in获得Document对象。
		Document doc = sb.build(Thread.currentThread().getContextClassLoader().getResourceAsStream(CONFIG_FILE_NAME));
		//通过Document对象可以取到根元素了。
		this.rootElt=doc.getRootElement();
		//此处如使用rootElt.getChildren();可以一层一层地往下找,但是我们采用一种更快的方式,采用xpath。
		//调用initJdbcInfo()方法
		initJdbcInfo();
		//调用initBeans()方法
		initBeans();
		
		} catch (JDOMException e) {
			// TODO 
			e.printStackTrace();
		} catch (IOException e) {
			// TODO 
			e.printStackTrace();
		}
	}

	public static Globleconfigue getInstance() {
		return instance;
	}
	
	/*
	 * 初始化数据库连接信息
	 */
	private void initJdbcInfo(){
		try {
			//返回一个Elenment对象
			Element driveClassNameElt = (Element) XPath.selectSingleNode(rootElt, "//sys-configure/jdbc-info/driver-class-name");
			//System.out.println(driveClassNameElt.getText());
			//此处就把DbDriver_属性赋值了
			dbManager.setDbDriver_(driveClassNameElt.getText());
			
			Element urlElt = (Element) XPath.selectSingleNode(rootElt, "//sys-configure/jdbc-info/url");
			dbManager.setDbUrl_(urlElt.getText());
			
			Element userNameElt = (Element) XPath.selectSingleNode(rootElt, "//sys-configure/jdbc-info/user-name");
			dbManager.setDbLogin_(userNameElt.getText());
			
			Element passwordElt = (Element) XPath.selectSingleNode(rootElt, "//sys-configure/jdbc-info/password");
			dbManager.setDbPassword_(passwordElt.getText());//至此完成了对DBManager属性的设值。
			
			System.out.println("dbManager类驱动:  "+dbManager.getDbDriver_()+"   ======  "+"dbManager类url:  "+dbManager.getDbUrl_());
			
		} catch (JDOMException e) {
			// TODO 
			e.printStackTrace();
		}
	}
	
	
	/*
	 * 获取bean配置中的类的对象
	 */
	private void initBeans(){
		try {
			//返回一个List对象(List内部的每一个是Element元素),此时运用方法 XPath.selectNodes
			List beanList =  XPath.selectNodes(rootElt,"//sys-configure/beans/bean");
			for(Iterator iter=beanList.iterator(); iter.hasNext();){
				Element beanElt=(Element)iter.next();
				//此处的id对应xml文件中的ID
				String id=beanElt.getAttributeValue("id");
				String className=beanElt.getAttributeValue("class");
				System.out.println("id="+id);
				System.out.println("name="+className);
				//以下两步把bean实例化好了,并放在map中。
				Object obj=Class.forName(className).newInstance();//用反射机制获得对象
				beanMap.put(id, obj);
			}
			
		} catch (JDOMException e) {
			// TODO 
			e.printStackTrace();
		} catch (InstantiationException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	public Object getBean(String c){
	return	beanMap.get(c);
	}
	

	public static void main(String[] args){
		Globleconfigue.getInstance();
		CategoryBourse categoryBourse=(CategoryBourse)Globleconfigue.getInstance().getBean("categoryBourse");
		
	}
	

}

 
 4、CategoryBourse.java

  一个空实现的类

 

 

 5、jdom写入

package hz.data;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.output.Format;
import org.jdom.output.XMLOutputter;

/*
 * <selects>
 *   <select>
 *     <id>1</id>
 *     <name>浙江</name>
 *   </select>
 *   <select>
 *     <id>2</id>
 *     <name>辽宁</name>
 *   </select>	  
 * </selects>
 */
public class XMLWrite {
	public static void main(String[] args){
	Element rootElt=new Element("selects");
	Element selectElt=new Element("select");
	Element idElt=new Element("id");
	idElt.addContent("1");
	
	Element valueElt=new Element("name");
	valueElt.addContent("浙江");
	
	selectElt.addContent(idElt);
	selectElt.addContent(valueElt);
	rootElt.addContent(selectElt);
	//以上是建立父子关系的对象
	//以下为输出
	Document doc=new Document(rootElt);//此处把rootElt给Document这个类相当于给了他整个文件
	XMLOutputter out=new XMLOutputter();//jdom中专门用来输出的,out可以接相应的输出流来输出了
	//这句话可以来改变默认编码GBk,改为GB2312
	out.setFormat(Format.getCompactFormat().setEncoding("GB2312"));
	//此处为了方便演示,先生成字符串
	String xmlStr=out.outputString(doc);
	//输出到屏幕
	System.out.print(xmlStr);
	//保存到文件中
	try {
		out.output(doc, new FileOutputStream("c://test.xml"));
	} catch (FileNotFoundException e) {
		e.printStackTrace();
	} catch (IOException e) {
		e.printStackTrace();
	}
	
	}	
}

 验证以上写如对不对,最简单的方法是用ie浏览器打开生成的xml文件。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值