java中如何读取xml中数据。多节点的。给我一个例子,谢谢。
4个回答
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文件是使用最简单的形式 ,因此解析器相对简单,但是这已经足够对付我们的配置文件了.
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来帮助完成,而不是自己写,这样,才可以缩短开发周期,降低开发成本。
现在,我们在开发过程中的确可以自己利用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;
}
}
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;
}
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询