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

Castor XML 綁定實戰:從映射檔到 Java 物件雙向轉換完整範例

     編輯:Java 相關知識

Castor XML 綁定實戰:從映射檔到 Java 物件雙向轉換完整範例

近期研究 Java 物件與 XML 互轉,發現 Castor 是輕量級的優秀選擇。參考網上資料並修正其中錯誤,在 Eclipse 中完成一個完整範例:讀取 page.xml → 反序列化為 Java 物件 → 列印內容 → 序列化輸出 d.xml。完整代碼結構如下:

1. 來源 XML(page.xml)

<HOMEPAGECOLLECTION name="this is sample">
  <HOMEPAGECONTENT id="1">
    <NAME>About Us</NAME>
    <NAVLINK>1.JSP</NAVLINK>
    <ICON>images/icon.gif</ICON>
    <DESCRIPTION>An in-depth look at creating applications with XML.</DESCRIPTION>
  </HOMEPAGECONTENT>
  <HOMEPAGECONTENT id="2">
    <NAME>Product|Service</NAME>
    <NAVLINK>2.JSP</NAVLINK>
    <ICON>images/icon.gif</ICON>
    <DESCRIPTION>let's tak a look at our products.</DESCRIPTION>
  </HOMEPAGECONTENT>
</HOMEPAGECOLLECTION>

2. JavaBean:Homepagecontent.java

package tryForCastor;
public class Homepagecontent implements java.io.Serializable {
    private static final long serialVersionUID = 3689909565688657717L;
    private Integer id;
    private String name, navlink, icon, description;
    // 無參建構子、getter/setter 略
}

3. 容器類別:Homepagecollection.java

package tryForCastor;
import java.util.*;
public class Homepagecollection implements java.io.Serializable {
    private static final long serialVersionUID = 3545239128603309878L;
    private String siteName;
    private List<Homepagecontent> homepagecontents = new ArrayList<>();
    public void addHomePageContent(Homepagecontent hpc) { homepagecontents.add(hpc); }
    public List<Homepagecontent> getHomepagecontents() { return homepagecontents; }
    public String getName() { return siteName; }
    public void setName(String name) { this.siteName = name; }
}

4. 映射檔:mapping.xml(核心)

<MAPPING>
  <DESCRIPTION>a map file for our new template system</DESCRIPTION>
  <CLASS name="Homepagecontent">
    <MAP-TO xml="homepagecontent">
      <FIELD name="id" type="integer">
        <BIND-XML name="id" node="attribute"/>
      </FIELD>
      <FIELD name="name" type="string"><BIND-XML name="NAME"/></FIELD>
      <FIELD name="navlink" type="string"><BIND-XML name="NAVLINK"/></FIELD>
      <FIELD name="icon" type="string"><BIND-XML name="ICON"/></FIELD>
      <FIELD name="description" type="string"><BIND-XML name="DESCRIPTION"/></FIELD>
    </MAP-TO>
  </CLASS>
  <CLASS name="Homepagecollection">
    <MAP-TO xml="homepagecollection">
      <FIELD name="name" type="string">
        <BIND-XML name="name" node="attribute"/>
      </FIELD>
      <FIELD name="homepagecontents" type="Homepagecontent" collection="collection"/>
    </MAP-TO>
  </CLASS>
</MAPPING>

關鍵點:node="attribute" 對應 XML 屬性;collection="collection" 聲明 List 集合映射;巢狀結構需層層對應。

5. 轉換主程式:tryCastor.java

package tryForCastor;
import java.io.*;
import java.util.*;
import org.exolab.castor.mapping.Mapping;
import org.exolab.castor.xml.Marshaller;
import org.exolab.castor.xml.Unmarshaller;

public class tryCastor {
    private Mapping mapping;
    private String xmlFile;

    public void HomePageHandle(String mapFile, String xmlFile) throws Exception {
        this.xmlFile = xmlFile;
        mapping = new Mapping();
        mapping.loadMapping(mapFile);
    }

    public Homepagecollection read() throws Exception {
        Unmarshaller un = new Unmarshaller(Homepagecollection.class);
        un.setMapping(mapping);
        FileReader in = new FileReader(xmlFile);
        Homepagecollection hc = (Homepagecollection) un.unmarshal(in);
        in.close();
        return hc;
    }

    public FileWriter write(String outFile, Object obj) throws Exception {
        FileWriter out = new FileWriter(outFile);
        Marshaller mar = new Marshaller(out);
        mar.setMapping(mapping);
        mar.marshal(obj);
        return out;
    }

    public static void main(String[] args) {
        tryCastor tc = new tryCastor();
        try {
            tc.HomePageHandle("mapping.xml", "page.xml");
            Homepagecollection hc = tc.read();
            for (Homepagecontent h : hc.getHomepagecontents()) {
                System.out.println(h.getDescription());
                System.out.println(h.getIcon());
                System.out.println(h.getName());
                System.out.println(h.getNavlink());
                System.out.println(h.getId());
                System.out.println("+++++++++++++++++++++++");
            }
            FileWriter fw = tc.write("d.xml", hc);
            if (fw != null) fw.close();
        } catch (Exception e) { e.printStackTrace(); }
    }
}

執行結果與心得

  • 成功將 XML 反序列化為物件圖,並序列化回 XML,結構完整保留。
  • 映射檔編寫較繁瑣:每個欄位、屬性、集合都需手工對應,專案大時維護成本高。
  • 疑問:能否自動掃描 JavaBean 屬性生成映射? Castor 支援無映射檔的自動模式(依命名慣例),但靈活性較低,複雜結構仍需手工映射。
  • 替代方案:JAXB(標準、註解驅動)、XStream(簡潔無映射檔)、Dom4j/JDOM + 手工解析。選型視專案複雜度與團隊熟悉度而定。

Castor 適合中小型專案、需精細控制 XML 結構的場景。掌握映射檔寫法,是驅動 Castor 的關鍵技能。

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