Java 與 XML 是黃金組合。XML 在電子商務資料交換中不可替代,但在一般系統開發中,不一定需要資料交換,是否就無法使用 XML?當然不是。新趨勢是 Java 程式的配置檔採用 XML 格式(早期用 Windows INI 格式,Java 有 Properties 類處理)。採用 XML 作配置檔好處多多,從 Tomcat、J2EE 配置檔即可見 XML 普及應用。
主流 XML 解析器有 DOM 與 SAX。Apache XML 專案組有 Xerces、Xalan、Cocoon 等專案。Tomcat 用 Sun 的 JAXP,XSL Taglib 用 Xerces。
實際切入:程式中常需根據主機環境決定的變數(如資料庫帳號密碼),只需修改 XML 配置檔即可移植。範例 myenv.xml 放在 Tomcat 的 WEB-INF/classes 目錄:
<?xml version="1.0" encoding="UTF-8"?>
<config>
<dbhost>localhost</dbhost>
<sqlname>sqlname</sqlname>
<username>username</username>
<passWord>password</passWord>
</config>
編寫 Java 程式讀取並提取 dbhost、dbuser、dbpassword 供其他程式存取資料庫。SAX 逐行讀取適合大檔案,DOM 一次性載入記憶體不適合大檔。此處採用 SAX 解析(基於 JDK 1.4 改進實測)。
ConfigParserimport org.xml.sax.Attributes;
import org.xml.sax.helpers.DefaultHandler;
import org.xml.sax.SAXException;
import java.util.Properties;
public class ConfigParser extends DefaultHandler {
private Properties props;
private String currentSet;
private String currentName;
private StringBuffer currentValue = new StringBuffer();
public ConfigParser() { this.props = new Properties(); }
public Properties getProps() { return this.props; }
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
currentValue.delete(0, currentValue.length());
this.currentName = qName;
}
public void characters(char[] ch, int start, int length) throws SAXException {
currentValue.append(ch, start, length);
}
public void endElement(String uri, String localName, String qName) throws SAXException {
props.put(qName.toLowerCase(), currentValue.toString().trim());
}
}
解析程式簡單易懂。解析出的屬性存放在 props 中,但外部程式尚無法存取,需再撰寫封裝類別 ParseXML:
import java.util.Properties;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import java.net.URL;
public class ParseXML {
private Properties props;
public Properties getProps() { return this.props; }
public void parse(String filename) throws Exception {
ConfigParser handler = new ConfigParser();
SAXParserFactory factory = SAXParserFactory.newInstance();
factory.setNamespaceAware(false);
factory.setValidating(false);
SAXParser parser = factory.newSAXParser();
// 取得配置檔路徑 (Tomcat 中在 WEB-INF/classes)
URL confURL = BeansConstants.class.getClassLoader().getResource(filename);
try {
parser.parse(confURL.toString(), handler);
props = handler.getProps();
} finally {
factory = null;
parser = null;
handler = null;
}
}
}
至此,即可在應用程式中呼叫 ParseXML 取得配置屬性。