通常一些應用框架都會用 XML 作為配置,而且很多都支持多個 XML 文件,例如 Struts 框架可以配置多個 struts-config-xxx.xml 文件,Spring 也允許你用多個 applicationContext-xxx.xml 文件,再比如 DWR 也是可以由多個 dwr-xxx.xml 依功能或其他方式分開來配置。我們知道,這樣的多個 XML 有相同的規范定義,那麼程序如何一並解析它們呢?我看過 ActionServlet 是對 struts-config-xxx.xml 逐個解析的。我這裡介紹的一種方法是把那些有著相同規范定義的 XML 合成一個 Document 然後對這個 Document 對象進行處理,如 XPath 查找、進行 DOM 對象操作,就不需要每次到多個 Document 中去查找一遍。
眾所周知,對 XML 的操作有兩種方式,DOM:XML 映射在內存中一顆樹;SAX:基於事件的方式。常用的 XML Java 解析組件有 DOM4J(apache的)、JDOM、和JAXP(Sun的),它們都提供了 DOM 和 SAX 實現和 Xpath 查找。
下面我就介紹用 JDOM 完成對多個 XML 文件進行合並得到一個 Document 對象,實現代碼如下:
/*
研究這個的目的是,我想做一個工具合並多個 Struts-config 配置文件,然後輸入 nath、nction、norward、name 或 type 等中的一個屬性值查找到相關的其他屬性值,這樣能方便程序調試,比如看到哪個 aciton.do 就知道會轉向到哪些個頁面,附著了哪個 formbean,以及其他相關的屬性值是什麼。
* Created on Sep 23, 2007
*/
package com.unmi;
import Java.io.IOException;
import Java.util.List;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.JDOMException;
import org.jdom.input.SAXBuilder;
/**
* Combine two or more XML together as one document
* I put this Operation into main method.
* @author Unmi
*/
public class CombineXML
{
/**
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception
{
Document document = null;
try {
SAXBuilder dbf = new SAXBuilder();
document = (Document) dbf.build(args[0]);
Element docRoot = document.getRootElement();
for (int i = 1; i < args.length; i++) {
Document tmpdoc = dbf.build(args[i]);
List<Element> nlt = tmpdoc.getRootElement().getChildren();
for (int j = 0; j < nlt.size(); ) {
Element el = nlt.get(0);
// get free element
el.detach();
docRoot.addContent(el);
}
}
} catch (IOException e) {
throw new Exception("File not readable.");
} catch (JDOMException e) {
throw new Exception("File parsed error.");
}
//TODO, You can process that document now.
}
}
/*
* Created on Sep 23, 2007
*/
package com.unmi;
import Java.io.IOException;
import Java.util.List;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.JDOMException;
import org.jdom.input.SAXBuilder;
/**
* Combine two or more XML together as one document
* I put this Operation into main method.
* @author Unmi
*/
public class CombineXML
{
/**
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception
{
Document document = null;
try {
SAXBuilder dbf = new SAXBuilder();
document = (Document) dbf.build(args[0]);
Element docRoot = document.getRootElement();
for (int i = 1; i < args.length; i++) {
Document tmpdoc = dbf.build(args[i]);
List<Element> nlt = tmpdoc.getRootElement().getChildren();
for (int j = 0; j < nlt.size(); ) {
Element el = nlt.get(0);
// get free element
el.detach();
docRoot.addContent(el);
}
}
} catch (IOException e) {
throw new Exception("File not readable.");
} catch (JDOMException e) {
throw new Exception("File parsed error.");
}
//TODO, You can process that document now.
}
}