java中如何读取xml中数据。多节点的。给我一个例子,谢谢。
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java中如何读取xml中数据。多节点的。给我一个例子,谢谢。相关的知识,希望对你有一定的参考价值。
在我们的程序中,通常要有一些根据主机环境确定的变量.比如数据库访问用户名和密码,不同的主机可能设置不一样.只要更改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文件是使用最简单的形式 ,因此解析器相对简单,但是这已经足够对付我们的配置文件了. 参考技术A 我认为上面的朋友把问题复杂化了,楼主问的是怎么读,而不是要你的code..
现在,我们在开发过程中的确可以自己利用java固有的api来做一些事情,但是,我们更有工具类api,比如apache 这样的开源组织提供的api就收到广泛的应用..
这位朋友先读取xml这样的广泛的东西,第一想法应该是有开源的api来帮助完成,而不是自己写,这样,才可以缩短开发周期,降低开发成本。 参考技术B 来我的博客看看吧。
我是专门做这方面工作研发的。嘿嘿 参考技术C 给你一个解析的类吧(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;
java 如何读取xml文件中的一个节点下的多个相同子节点
xml文件中的要读出的部分
<REFNOS>
<REFNO>111111111</REFNO>
<REFNO>222222222</REFNO>
<REFNO>333333333</REFNO>
<REFNO>444444444</REFNO>
</REFNOS>
下面这段代码只有在节点下面有一个的情况下读出来,请高手指教,如果有多个相同节点的话读出来的都是null。
Element records = e.element("REFNOS");
if (records != null)
List elemList = records.elements();
int elength = elemList.size();
for (int i = 0; elemList != null && i < elength; i++)
Element e1 = (Element) elemList.get(i);
nodeRefNo = e1.elementText("REFNO");}
这样的话只能读出节点下有一个元素的。
有没有e.elements.... 参考技术B 我想,你也许想使用xpath或者xquery来进行操作
以上是关于java中如何读取xml中数据。多节点的。给我一个例子,谢谢。的主要内容,如果未能解决你的问题,请参考以下文章