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

XML 數據綁定系列(三):Unmarshaller 將 XML 文檔轉換為 Java 物件

     編輯:Java 相關知識

數據綁定系列第三篇:實現 Unmarshaller 將符合 Schema 的 XML 實例文檔轉換為生成類的 Java 物件。採用 JDOM 解析、反射調用 setter、資料類型映射、遞歸處理巢狀元素,附完整測試與 Web Service 啟動範例。

XML 實例文檔範例

<?xml version="1.0"?>
<webServiceConfiguration xmlns="https://www.enhydra.org"
    version="1.1" name="Unsecured Web Listener">
  <port number="80" protocol="http" protectedPort="false"/>
  <document root="/usr/local/enhydra/html" index="*.html,*.xml" error="error.html"/>
</webServiceConfiguration>

Unmarshaller 核心流程

  1. SAXBuilder 解析 XML 為 JDOM Document
  2. 根據根元素名稱推斷實現類名(WebServiceConfigurationImpl)
  3. 反射實例化,遍歷屬性 → 呼叫 setXxx
  4. 遍歷子元素 → 遞歸構建子物件 → 呼叫 setXxx

關鍵代碼片段

靜態入口

public static Object unmarshall(URL instanceURL) throws IOException {
    Document doc = new SAXBuilder().build(instanceURL);
    return new Unmarshaller().getJavaRepresentation(doc.getRootElement());
}

屬性映射與類型轉換

// DataMapping.getParameter(String value, Class targetType)
public static Object getParameter(String value, Class type) {
    String t = type.getName();
    if (t.equals("java.lang.String")) return value;
    if (t.equals("int") || t.equals("java.lang.Integer")) return Integer.valueOf(value);
    if (t.equals("long") || t.equals("java.lang.Long")) return Long.valueOf(value);
    if (t.equals("float") || t.equals("java.lang.Float")) return Float.valueOf(value);
    if (t.equals("double") || t.equals("java.lang.Double")) return Double.valueOf(value);
    if (t.equals("boolean") || t.equals("java.lang.Boolean")) return Boolean.valueOf(value);
    return null; // 可擴充 Date 等
}

遞歸處理巢狀元素

for (Element child : rootElement.getChildren()) {
    String setter = "set" + BindingUtils.initialCaps(child.getName());
    Method method = findMethod(objectClass, setter);
    Object childObj = getJavaRepresentation(child); // 遞歸
    method.invoke(obj, childObj);
}

測試驗證

Object o = Unmarshaller.unmarshall(new File("xml/example.xml").toURL());
WebServiceConfiguration cfg = (WebServiceConfiguration) o;
assertEquals("Unsecured Web Listener", cfg.getName());
assertEquals(80, cfg.getPort().getNumber());
assertEquals("http", cfg.getPort().getProtocol());

Web Service 啟動整合

for (URL url : configUrls) {
    WebServiceConfiguration cfg = Unmarshaller.unmarshal(url);
    WebService svc = new WebService();
    svc.setName(cfg.getName());
    svc.setPortNumber(cfg.getPort().getNumber());
    svc.setProtocol(cfg.getPort().getProtocol());
    svc.start();
}

JDOM API 版本同步說明

代碼已適配 JDOM Beta 5,方法名稱有變更,請使用隨文提供的最新源碼包。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved