java中如何读取xml中数据。多节点的。给我一个例子,谢谢。

 我来答
匿名用户
2013-07-17
展开全部
在我们的程序中,通常要有一些根据主机环境确定的变量.比如数据库访问用户名和密码,不同的主机可能设置不一样.只要更改XML配置文件,就可以正常运行.

localhost

sqlname

username

password

上面这个myenv.xml配置文件一般是放在tomcat的WEB-INF/classes目录下.

我们编制一个Java程序直接读取,将dbhost dbuser dbpassword提取出来供其他程序访问数据库用.

目前使用SAX比较的多,与DOM主要区别是 SAX是一行一行读取XML文件进行分析,适合比较大文件,DOM是一次性读入内存,显然不能对付大文件.这里我们使用SAX解析,由于SAX解析器不断在发展,网上有不少文章是针对老版本的.假如你使用JDK1.4 ,可以参考 使用SAX处理XML文档 一文.这里的程序是根据其改进并且经过实践调试得来的.

对上面myenv.xml读取的Java程序:

import org.xml.sax.Attributes;

import org.xml.sax.helpers.DefaultHandler;

import org.xml.sax.SAXException;

import java.util.Properties;

//使用DefaultHandler的好处 是 不必陈列出所有方法,

public class ConfigParser extends DefaultHandler {

////定义一个Properties 用来存放 dbhost dbuser dbpassword的值

private Properties props;

private String currentSet;

private String currentName;

private StringBuffer currentValue = new StringBuffer();

//构建器初始化props

public ConfigParser() {

this.props = new Properties();

}

public Properties getProps() {

return this.props;

}

//定义开始解析元素的方法. 这里是将中的名称xxx提取出来.

public void startElement(String uri, String localName, String qName, Attributes attributes)

throws SAXException {

currentValue.delete(0, currentValue.length());

this.currentName =qName;

}

//这里是将之间的值加入到currentValue

public void characters(char[] ch, int start, int length) throws SAXException {

currentValue.append(ch, start, length);

}

//在碰到结束后,将之前的名称和值一一对应保存在props中

public void endElement(String uri, String localName, String qName) throws SAXException {

props.put(qName.toLowerCase(), currentValue.toString().trim());

}

}

上面的这个解析程序比较简单吧? 其实解析XML就是这么简单.

现在我们已经将dbhost dbuser dbpassword的值localhost sqlname username password提取了出来.但是这只是在在解析器内部,我们的程序还不能访问.需要再编制一个程序.

import java.util.Properties;

import javax.xml.parsers.SAXParser;

import javax.xml.parsers.SAXParserFactory;

import java.net.URL;

public class ParseXML{

//定义一个Properties 用来存放 dbhost dbuser dbpassword的值

private Properties props;

//这里的props

public Properties getProps() {

return this.props;

}

public void parse(String filename) throws Exception {

//将我们的解析器对象化

ConfigParser handler = new ConfigParser();

//获取SAX工厂对象

SAXParserFactory factory = SAXParserFactory.newInstance();

factory.setNamespaceAware(false);

factory.setValidating(false);

//获取SAX解析

SAXParser parser = factory.newSAXParser();

//得到配置文件myenv.xml所在目录. tomcat中是在WEB-INF/classes

//下例中BeansConstants是用来存放xml文件中配置信息的类,可以自己代替或定义

URL confURL = BeansConstants.class.getClassLoader().getResource(filename);

try

{

//将解析器和解析对象myenv.xml联系起来,开始解析

parser.parse(confURL.toString(), handler);

//获取解析成功后的属性 以后 我们其他应用程序只要调用本程序的props就可以提取出属性名称和值了

props = handler.getProps();

}finally{

factory=null;

parser=null;

handler=null;

}

}

}

由于我们的XML文件是使用最简单的形式 ,因此解析器相对简单,但是这已经足够对付我们的配置文件了.
匿名用户
2013-07-17
展开全部
我认为上面的朋友把问题复杂化了,楼主问的是怎么读,而不是要你的code..
现在,我们在开发过程中的确可以自己利用java固有的api来做一些事情,但是,我们更有工具类api,比如apache 这样的开源组织提供的api就收到广泛的应用..
这位朋友先读取xml这样的广泛的东西,第一想法应该是有开源的api来帮助完成,而不是自己写,这样,才可以缩短开发周期,降低开发成本。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
匿名用户
2013-07-17
展开全部
来我的博客看看吧。
我是专门做这方面工作研发的。嘿嘿
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
匿名用户
2013-07-17
展开全部
给你一个解析的类吧(jdom自行下载):
package com.parxml;

import org.jdom.*;
import org.jdom.input.*;
import java.io.*;
import java.util.*;

/**
* <p>
* Description:本类实现对XML的解析操作
* </p>
* <p>
* Copyright: Copyright (c) 2007
* </p>
* <p>
* Company:QC
* </p>
*
* @author yexb
* @version v1.0
*/

public class ParserXML {

public ParserXML(){
//构造函数
}

/**
* 解析XML到HashMap
*
* @param xml
* String:传入的XML
* @param map
* HashMap:解析后的MAP
* @return HashMap
* @throws JDOMException
* @throws IOException
*/

public HashMap XMLToMap(String xml,HashMap<String,String> map) throws JDOMException, IOException {
if(map==null){
map = new HashMap<String, String>();
}
InputStream in = new ByteArrayInputStream(xml.getBytes("gb2312"));
SAXBuilder builder = new SAXBuilder();
Document doc = builder.build(in);
Element root = doc.getRootElement();
boolean tag = elementToMap(root.getChildren(),map);
if(!tag){
map.clear();
}
return map;
}

/**
* 把XML的内容的节点取出,转换成 Name = Value (键值对)的形式
*/
private boolean elementToMap(List list, HashMap<String, String> map) {
for (int i = 0; i < list.size(); i++) {
Element emt = (Element) list.get(i);
if (emt.getTextTrim() != null && emt.getTextTrim().length() > 0) {
map.put(emt.getName(), emt.getTextTrim());
}
List listChildern = emt.getChildren();
if (listChildern.size() > 0) {
elementToMap(listChildern, map);
}
}
return true;
}

/**
* 转换XML属性值到HashMap
*
* @param xml
* String:传入的XML
* @param map
* HashMap:解析后的MAP
* @return HashMap
* @throws JDOMException
* @throws IOException
*/
public HashMap xmlAttributeToMap(String xml , HashMap<String,String> map) throws JDOMException, IOException{
if(map==null){
map = new HashMap<String, String>();
}
InputStream in = new ByteArrayInputStream(xml.getBytes("gb2312"));
SAXBuilder builder = new SAXBuilder();
Document doc = builder.build(in);
Element root = doc.getRootElement();
boolean tag = attributeElementToMap(root.getChildren(),map);
if(!tag){
map.clear();
}
return map;
}
/**
* 把XML的内容节点取出,转换成 ParentName.SelfName = Value 的形式
*/
public boolean attributeElementToMap(List list , HashMap<String, String> map){
for (int i = 0; i < list.size(); i++) {
Element e = (Element) list.get(i);
List l_att = e.getAttributes();
for (int t = 0; t < l_att.size(); t++) {
Attribute attribute = (Attribute) l_att.get(t);
String name = attribute.getName();
String value = attribute.getValue();
map.put(name, value);// 属性
}
java.util.List listChildern = e.getChildren();
if (listChildern.size() > 0) {
attributeElementToMap(listChildern, map);
}
}
return true;
}
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式