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

XML 數據綁定系列(二):SchemaMapper 從 XML Schema 生成 Java 介面與實現類

     編輯:Java 相關知識

數據綁定系列第二篇:SchemaMapper 讀取 XML Schema,解析 complexType、element、屬性與繼承關係,自動生成 Java 介面(ServiceConfiguration)、實現類(ServiceConfigurationImpl)及輔助工具類,支援顯式/隱式類型命名慣例。

輸入 Schema 片段

<complexType name="ServiceConfiguration">
  <attribute name="name" type="string"/>
  <attribute name="version" type="float"/>
</complexType>
<complexType name="WebServiceConfiguration" baseType="ServiceConfiguration" derivedBy="extension">
  <element name="port">...</element>
  <element name="document">...</element>
</complexType>

命名慣例

Schema 構造生成介面生成實現
顯式 complexType name="Foo"FooFooImpl
隱式 element name="bar"BarTypeBarTypeImpl
baseType 繼承extends Parentextends ParentImpl

SchemaMapper 核心架構

public class SchemaMapper {
    private Map interfaces = new HashMap<>();
    private Map implementations = new HashMap<>();
    private Map> properties = new HashMap<>();

    public void generateClasses(URL schemaURL) throws IOException {
        Document doc = new SAXBuilder().build(schemaURL);
        for (Element ct : doc.getRootElement().getChildren("complexType", schemaNS)) {
            handleComplexType(ct);
        }
    }

    public void writeClasses(File dir) throws IOException {
        for (Map.Entry e : interfaces.entrySet()) {
            writeFile(dir, e.getKey() + ".java", e.getValue());
        }
        // 同樣寫入 implementations
    }
}

關鍵邏輯:處理 complexType

  1. 判斷顯式/隱式類型,決定介面名
  2. 解析 baseType 處理繼承
  3. 遍歷 attribute 與 element 收集屬性
  4. 生成介面:getter/setter 簽名
  5. 生成實現:private 欄位 + 方法實作
  6. 存入 Map 待寫檔

生成代碼範例

// ServiceConfiguration.java
public interface ServiceConfiguration {
    void setVersion(float version); float getVersion();
    void setName(String name); String getName();
}

// ServiceConfigurationImpl.java
public class ServiceConfigurationImpl implements ServiceConfiguration {
    private String name; private float version;
    // getter/setter 實作
}

輔助工具類

  • BindingUtils.initialCaps() / initialLowercase() — 首字母大小寫轉換
  • DataMapping — Schema 類型到 Java 類型映射

擴充:支援數值範圍約束

Schema 中 <minExclusive>/<maxInclusive> 可映射為 setter 內的範圍檢查拋出 IllegalArgumentException,實現型別與範圍雙重安全。

編譯與使用

java org.enhydra.xml.binding.SchemaMapper xml/configuration.xsd
javac -d . *.java
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved