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");}
这样的话只能读出节点下有一个元素的。

参考技术A 你的e.element...不就是一个元素吗。

有没有e.elements....
参考技术B 我想,你也许想使用xpath或者xquery来进行操作

以上是关于java中如何读取xml中数据。多节点的。给我一个例子,谢谢。的主要内容,如果未能解决你的问题,请参考以下文章

java如何读取xml节点元素值?

java怎样读取解析xml文件中的数据转换成java对象

在c#的winform 下怎么读取 xml文件中的数据?

读取在java中存储为字符串的xml [重复]

如何在c#中读取xml文件的节点,其中xml文件是2 xml文件数据的组合?

java中使用xpath读取xml指定节点的属性的名称列表