可扩展标记语言(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文件。