首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 程式設計入門

Java 讀取 XML 配置文件實戰:基於 SAX 解析器的輕量級方案

     編輯:Java 程式設計入門

為什麼選 XML 做配置?

相比傳統 .properties/.ini,XML 提供層級結構、型別擴展、命名空間、驗證等優勢,已成 Java EE 標準(Tomcat server.xml, web.xml 等)。

解析器選型:SAX vs DOM

特性SAXDOM
模式事件驅動、流式讀取樹模型、一次性載入記憶體
記憶體極低(適合大檔)正比檔案大小
隨機存取不支援支援
適用場景配置檔、大型資料交換小檔、需頻繁修改樹結構

配置檔通常較小,但 SAX 代碼簡潔、效能穩定,本文採用 SAX(JDK 內建 javax.xml.parsers)。

範例配置 myenv.xml

<config>
  <dbhost>localhost</dbhost>
  <sqlname>mydb</sqlname>
  <username>admin</username>
  <password>secret</password>
</config>

放置於 WEB-INF/classes(Classpath 根路徑)。

步驟 1:編寫 Handler 繼承 DefaultHandler

public class ConfigParser extends DefaultHandler {
    private Properties props = new Properties();
    private String currentElement;
    private StringBuffer currentValue = new StringBuffer();

    @Override
    public void startElement(String uri, String localName, String qName, Attributes attrs) {
        currentElement = qName;
        currentValue.setLength(0); // 重置緩衝
    }

    @Override
    public void characters(char[] ch, int start, int length) {
        currentValue.append(ch, start, length); // 累積文字內容
    }

    @Override
    public void endElement(String uri, String localName, String qName) {
        props.put(qName.toLowerCase(), currentValue.toString().trim());
    }

    public Properties getProps() { return props; }
}

步驟 2:封裝解析入口類

public class XmlConfigLoader {
    private Properties props;

    public Properties getProps() { return props; }

    public void parse(String filename) throws Exception {
        ConfigParser handler = new ConfigParser();

        SAXParserFactory factory = SAXParserFactory.newInstance();
        factory.setNamespaceAware(false);
        factory.setValidating(false); // 不驗證 DTD/Schema,加速

        SAXParser parser = factory.newSAXParser();

        // 從 Classpath 載入(適用 WAR/ JAR 內部資源)
        URL url = getClass().getClassLoader().getResource(filename);
        if (url == null) throw new FileNotFoundException("Config not found: " + filename);

        parser.parse(url.toString(), handler);
        this.props = handler.getProps();
    }
}

步驟 3:使用範例

public class App {
    public static void main(String[] args) throws Exception {
        XmlConfigLoader loader = new XmlConfigLoader();
        loader.parse("myenv.xml");
        Properties cfg = loader.getProps();

        String host = cfg.getProperty("dbhost");
        String user = cfg.getProperty("username");
        String pwd  = cfg.getProperty("password");
        System.out.printf("連線資訊:%s / %s / ******%n", host, user);
    }
}

進階擴展建議

  • 型別轉換:在 endElement 中按元素名轉 Integer, Boolean 等。
  • 巢狀結構:用堆疊追蹤元素路徑(如 datasource.url),生成前綴鍵值。
  • 驗證:啟用 factory.setValidating(true) 搭配 XSD,確保配置合法。
  • 熱重載:結合 WatchService 監聽檔案變更,自動重新解析。

常見坑點

  1. characters() 可能多次調用分段傳回內容,必須用緩衝區累積(本文 StringBuffer 做法正確)。
  2. Classpath 資源路徑區分:getResource("myenv.xml") 找 classpath 根;getResource("config/myenv.xml") 找子目錄。
  3. 編碼:確保 XML 檔頭聲明 <?xml encoding="UTF-8"?>,Java 讀取預設 UTF-8。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved