1

ドメインオブジェクト用に、ある種のオブジェクト生成エンジンを構築したいと思います。たとえば、私がグラフを操作していると仮定しましょう。モデルはxmlで表され、実行時にそれらをロードしてJava表現を構築できるはずです。

たとえば、グラフには頂点とエッジがあるため、次のようになります。

<graph>
   <vertex id="n1" color="red", thickness="2">
   <vertex id="n2">
   <edge end1="${n1}", end2="${n2}"/>
</graph>

このために、次のJavaクラスで記述できるオブジェクトを取得したいと思います。

class Graph {
     List<Vertex> vertexList
     List<Edge> edgeList
}

class Vertex {
   String id
    ... various properties ... 
}

class Edge {
   Vertex end1
   Vertex end2
}

もう1つの要件は、次のようにループ内の頂点を定義できるようにすることです。

<graph>
  ...
    <for var = i, min = 1, max = 10, step = 1>
      <vertex id=$i.../> 
    </for>
  ... 
</graph>

Apache Jellyを使用することを考えましたが、これは「デッド」プロジェクトのようです。JaxBでは、このようなレベルの動的な動作は許可されていません。

私の質問は、そのようなタスクを実装するためにどのフレームワークを推奨できますか?

Apache Jellyのように機能するが、それでも維持されているものがある場合は、それも素晴らしい可能性があります:)

よろしくお願いします

4

1 に答える 1

2

JAXB(JSR-222)@XmlID実装は、との組み合わせを使用して、ドキュメント内の参照を簡単に処理できます@XmlIDREF。以下に例を示します。

JAVAモデル

グラフ

package forum13404583;

import java.util.List;
import javax.xml.bind.annotation.*;

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
class Graph {

    @XmlElement(name = "vertex")
    List<Vertex> vertexList;

    @XmlElement(name = "edge")
    List<Edge> edgeList;

}

バーテックス

Vertexクラスでは、注釈を使用して、フィールドがIDであることを示す必要があり@XmlIDますid

package forum13404583;

import javax.xml.bind.annotation.*;

@XmlAccessorType(XmlAccessType.FIELD)
class Vertex {

    @XmlAttribute
    @XmlID
    String id;

    @XmlAttribute
    String color;

    @XmlAttribute
    Integer thickness;

}

Edgeクラスでは、注釈@XmlIDREFを使用して、XML値に実際の値を参照する外部キーが含まれていることを示します。

package forum13404583;

import javax.xml.bind.annotation.*;

@XmlAccessorType(XmlAccessType.FIELD)
class Edge {

    @XmlAttribute
    @XmlIDREF
    Vertex end1;

    @XmlAttribute
    @XmlIDREF
    Vertex end2;

}

デモコード

package forum13404583;

import java.io.File;
import javax.xml.bind.*;

public class Demo {

    public static void main(String[] args) throws Exception {
        JAXBContext jc = JAXBContext.newInstance(Graph.class);

        Unmarshaller unmarshaller = jc.createUnmarshaller();
        File xml = new File("src/forum13404583/input.xml");
        Graph graph = (Graph) unmarshaller.unmarshal(xml);

        Marshaller marshaller = jc.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.marshal(graph, System.out);
    }

}

入力(input.xml)/出力

以下は、デモコードの実行への入力と実行からの出力です。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<graph>
    <vertex id="n1" color="red" thickness="2"/>
    <vertex id="n2"/>
    <edge end1="n1" end2="n2"/>
</graph>

詳細については

于 2012-11-16T11:34:21.597 に答える