这里将项目中学到的一点儿xml处理问题大致说一下,这里主要说两种方法

1.利用w3c处理xml问题及xml与String的转化:如下例子
import java.io.ByteArrayInputStream;

import java.io.ByteArrayOutputStream;
import java.io.InputStream;
 
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
 
public class TestXML {
 
public static void main(String args[]) {
/**
* string转xml
*/
   StringBuffer condition = new StringBuffer();
condition.append("<?xml version=\"1.0\" encoding=\"utf-8\"?>")
.append("<personList>")
.append("<name>onePerson</name>").append("<age>25</age>")
.append("<name>twoPerson</name>").append("<age>26</age>")
.append("<name>threePerson</name>").append("<age>27</age>")
.append("</personList>");
String strXML = condition.toString();
Document doc =stringConvertXML(strXML,"");
//从xml中解析name数据
NodeList nl = doc.getElementsByTagName("name");//根据标签获得列表
        Node classNode=nl.item(0);//取列表中第一个对象
        String cName=classNode.getTextContent();//获取对象的值
        System.out.println(cName);
        classNode.setTextContent("ddddddddddd");//修改xml中对象的值
    //从xml中解析age数据
        NodeList n2 = doc.getElementsByTagName("age");
        Node classNode2 = n2.item(2);
        System.out.println(classNode2.getTextContent());
        /**
         * xml转string
         */
        String strDoc = xmlConvertString(doc);
        System.out.println(strDoc);
}
/**
* xml转字符串
*/
public static String xmlConvertString(Document doc) {
 
String xmlStr = null;
try {
// XML转字符串
TransformerFactory tf = TransformerFactory.newInstance();
Transformer t = tf.newTransformer();
t.setOutputProperty("encoding", "utf-8");
ByteArrayOutputStream bos = new ByteArrayOutputStream();
t.transform(new DOMSource(doc), new StreamResult(bos));
xmlStr = bos.toString();
} catch (Exception e) {
e.printStackTrace();
}
 
return xmlStr;
}
/**
* string转xml
*/
public static Document stringConvertXML(String data, String code) {
 
StringBuilder sXML = new StringBuilder(code);
sXML.append(data);
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
Document doc = null;
try {
InputStream is = new ByteArrayInputStream(sXML.toString().getBytes(
"utf-8"));
doc = dbf.newDocumentBuilder().parse(is);
is.close();
} catch (Exception e) {
e.printStackTrace();
}
return doc;
}
}

还有一种是利用正则表达式方式直接从XML的String中获得节点值(这里只能获得节点值,若想获得节点其他属性则只能用W3C或DOM4J):如下例子:

    String xmlStr = "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>" +
                "<upomp application=\"PTransNotify.Req\"><merchantId>0111111222333445566</merchantId>" +
                "<merchantName>中国石化股份公司</merchantName><merchantOrderType>01</merchantOrderType></upomp>";

//利用正则表达式取出标签对应的值
        System.out.println("---商户ID---=="+xmlStr.replaceAll(".*<merchantId>(.*)</merchantId>.*", "$1"));
        System.out.println("---商户名称---=="+xmlStr.replaceAll(".*<merchantName>(.*)</merchantName>.*", "$1"));
        System.out.println("---订单类型---=="+xmlStr.replaceAll(".*<merchantOrderType>(.*)</merchantOrderType>.*", "$1"));

 //利用w3c取出标签属性对应的值(父标签树)
        Document doc = SystemUtils.stringConvertXML(xmlStr);
        Node node = doc.getFirstChild();
        Element e = null;
        if (node instanceof Element) {
            e = (Element) node;
        }
        System.out.println(e.getAttribute("application"));
最后至于Dom4j就不说了,
 

另:这个方法很专业

import java.io.StringWriter;

import org.apache.commons.configuration.ConfigurationException;

import org.apache.commons.configuration.XMLConfiguration;

import org.apache.commons.lang3.StringUtils;

 

public class ConstantXML {

public static String xmlString = null;

/*<?xml version="1.0" encoding="UTF-8" ?>

<upomp application="PTransNotify.Req">

<testKey>0111111222333445566</testKey>

</upomp>-------constant.xml*/

public static synchronized String getStringXml() {

if(StringUtils.isEmpty(xmlString)) {

XMLConfiguration config;

try {

config = new XMLConfiguration("constant.xml");

System.out.println(config.getString("testKey"));//通过key获得value

/**

* 将xml转为String

*/

StringWriter stringWriter = new StringWriter();

config.save(stringWriter);

xmlString = stringWriter.toString();

} catch (ConfigurationException e) {

e.printStackTrace();

}

}

return xmlString;

}

}

下面是网上的一个帖子

使用Apache Commons Configuration读取配置信息

73人收藏此文章,  我要收藏发表于9个月前(2012-05-12 16:28) , 已有2754次阅读 ,共 9个评论

    在项目中使用一些比较新的库总会给你带来很多快乐,在这篇文章中,我将会给你介绍一个在Java中读取配置文件的框架——Apache Commons Configuration framework. 
 

你会了解到

    ·从XML文件中获取数据
    ·访问环境变量
    ·连接不同类型的配置信息(基于XML的,基于环境变量的,等等)

    ·在程序改变后自动重新加载配置。

    在我们的示例中将会使用XML文件和环境变量的两种方式存储一个数据库的配置信息(开发、测试、产品,等等)。接下来你将会看到具体的内容,但是首先先配置一下Maven。
 

Maven设置

我们的示例程序需要在pom.xml文件中添加如下依赖:
 
01<dependencies>
02    <dependency>
03        <groupId>commons-configuration</groupId>
04        <artifactId>commons-configuration</artifactId>
05        <version>1.8</version>
06    </dependency>
07    <dependency>
08        <groupId>commons-beanutils</groupId>
09        <artifactId>commons-beanutils</artifactId>
10        <version>1.8.0</version>
11    </dependency>
12    <dependency>
13        <groupId>commons-jxpath</groupId>
14        <artifactId>commons-jxpath</artifactId>
15        <version>1.3</version>
16    </dependency>
17</dependencies>


简单的数据库配置

    设想我们有一个简单的数据库配置信息存储在XML文件中:
 
01<?xmlversion="1.0"encoding="UTF-8"?>
02<!-- const.xml -->
03<config>
04    <database>
05        <url>127.0.0.1</url>
06        <port>1521</port>
07        <login>admin</login>
08        <password>pass</password>
09    </database>
10</config>
 
    为了拿到url和port我们用如下的代码:
 
1XMLConfiguration config =new XMLConfiguration("const.xml");
2// 127.0.0.1
3config.getString("database.url");
4// 1521
5config.getString("database.port");
 
    XMLConfiguration是一个Apache Commons类,他可以从指定的配置文件中加载内容,并且提供一个很好的以指定的点的方式得到存储的值。例如例子中的表达式database.port映射到xml文件中的 config/database/port节点的值“1521”。当然还有很多方式获取数据。这里有一些基本的用法:
 
1getBoolean
2getByte
3getDouble
4getFloat
5getInt
6getInteger
7getList
8getLong
9getStringArray
    你可通过查看Apache Commons的JavaDoc查看更多的使用方式。


将如上配置扩展一步

    设想,过了一会我们想配置多个数据库,我们可以在配置文件中这样写:
 
01<?xmlversion="1.0"encoding="UTF-8"?>
02<!-- const.xml -->
03<config>
04    <databases>
05        <database>
06            <name>dev</name>
07            <url>127.0.0.1</url>
08            <port>1521</port>
09            <login>admin</login>
10            <password>pass</password>
11        </database>
12        <database>
13            <name>production</name>
14            <url>192.23.44.100</url>
15            <port>1521</port>
16            <login>admin</login>
17            <password>not-so-easy-pass</password>
18        </database>
19    </databases>
20</config>
    现在我们要访问url数据我们可以这样:
 
1XMLConfiguration config =new XMLConfiguration("const.xml");
2  
3// 127.0.0.1
4config.getString("databases.database(0).url");
5  
6// 192.23.44.100
7config.getString("databases.database(1).url");
    你可以看到这次多了参数,0代表第一个,1代表第二个。


XPath表达式

    定点的访问方式没问题,但是只是在一些简单的情况下,对于复杂的真实的状况来讲,我们可能需要使用XPath表达式语言。这里的主要优点是,即便你使用了XML的高级查询,程序看起来仍然比较简洁易懂。
 
1XMLConfiguration config =new XMLConfiguration("const.xml");
2config.setExpressionEngine(new XPathExpressionEngine());
3  
4// 127.0.0.1
5config.getString("databases/database[name = 'dev']/url");      
6  
7// 192.23.44.100
8config.getString("databases/database[name = 'production']/url");
    这里是上面两个XPath表达式查询的一个解释:


访问环境变量

    在Apache Commons Configuration的帮助下你可以轻松的访问到系统的环境变量。下面是访问系统中ENV_TYPE变量的方法:
 
1EnvironmentConfiguration config =new EnvironmentConfiguration();
2config.getString("ENV_TYPE");
    假设变量ENV_TYPE已经设置好了,想看上面的程序是否运行正确,你可以在控制台运行如下脚本:
 
1echo %ENV_TYPE%        # for Windows
2# or...
3echo $ENV_TYPE         # for Linux/Mac OS
你将会看到ENV_TYPE的值。


联合配置

    让我们总结一下我们了解的东西,下面的getDbUrl方法做如下事情:
    ·检查系统环境变量中叫做ENV_TYPE的值。
    ·如果值是dev或者produtcion就返回相应的数据库url
    ·如果变量没有配置就抛出异常。
01public String getDbUrl() throws ConfigurationException {
02    EnvironmentConfiguration envConfig =new EnvironmentConfiguration();
03    String env = envConfig.getString("ENV_TYPE");
04    if("dev".equals(env) ||"production".equals(env)) {
05        XMLConfiguration xmlConfig =new XMLConfiguration("const.xml");
06        xmlConfig.setExpressionEngine(new XPathExpressionEngine());
07        String xpath ="databases/database[name = '"+ env +"']/url";
08        return xmlConfig.getString(xpath);
09    }else{
10        String msg ="ENV_TYPE environment variable is "+
11                     "not properly set";
12        throw new IllegalStateException(msg);
13    }
14}


集中你的配置

    对每个不同的需要配置的对象创建多个配置比较烦。假如我们想添加其他的基于XML的配置,我们会怎么搞?我们需要创建另一个XMLConfiguration对象,这会给管理带来很多麻烦。一个解决办法是把配置文件信息集中到一个单个XML文件中。下面是一个例子:
 
1<?xmlversion="1.0"encoding="UTF-8"?>
2<!-- config.xml -->
3<configuration>
4  <env/>
5  <xmlfileName="const.xml"/>
6</configuration>
    你需要使用DefaultConfigurationBuilder类,最终版本的getDbUrl方法看起来像这样:
 
01public String getDbUrl()throws ConfigurationException {
02    DefaultConfigurationBuilder builder =
03        new DefaultConfigurationBuilder("config.xml");
04    boolean load =true;
05    CombinedConfiguration config = builder.getConfiguration(load);
06    config.setExpressionEngine(new XPathExpressionEngine());
07    String env = config.getString("ENV_TYPE");
08    if("dev".equals(env) ||"production".equals(env)) {
09        String xpath ="databases/database[name = '"+ env +"']/url";
10        return config.getString(xpath);
11    }else{
12        String msg ="ENV_TYPE environment variable is "+
13                     "not properly set";
14        throw new IllegalStateException(msg);
15    }
16}


自动重新加载

    Apache Commons Configuration有很多非常酷的特性。其中一个就是当基于文件的配置变化的时候自动加载,因为我们可以设置加载策略。框架会轮询配置文件,当文件的内容发生改变时,配置对象也会刷新。你可以用程序控制:
 
1XMLConfiguration config =new XMLConfiguration("const.xml");
2ReloadingStrategy strategy =new FileChangedReloadingStrategy();
3strategy.setRefreshDelay(5000);
4config.setReloadingStrategy(strategy);
    或者把他写到主配置文件中:
 
1<?xmlversion="1.0"encoding="UTF-8"?>
2<!-- config.xml -->
3<configuration>
4  <env/>
5  <xmlfileName="const.xml">
6    <reloadingStrategyrefreshDelay="5000"
7      config-class="org.apache.commons.configuration.reloading.FileChangedReloadingStrategy"/>
8  </xml>
9</configuration>
    每五秒框架都检查一下配置文件有没有改变。