0

私は単純な xml フレームワークを使用していますが、状況があります。

私のxmlは以下のようになります。

<root>
    <title> something </title>
    <desc> something more </desc>
     <mixture>
        <nodeA id="4" type="A">
        <nodeB id="5" type="B">
        <nodeB id="6" type="C">
        <nodeB id="7" type="D">
        <nodeB id="8" type="E">
        <nodeB id="9" type="F">
    </mixture>
</root>

以下のようにクラスとアノテーションを定義しました。

@Root(strict=false,name="root")
class Root{

    @Element
    private String title;

    @Element
    private String desc;

    @ElementList(required=false,inline=true)
    @Path("mixture")
    ArrayList<GenericNode> genericNodes;
}

@Root(strict = false)
@Convert(Convertor.class)
class GenericNode{
 //no annotation are defined
 //we ll handle the conversion ourself in "Convertor" class
}

mixture問題は、内部のすべてのノードをリストにマップしたいことです。しかし、私が定義したカスタム コンバーターが呼び出されていません。属性requiredを 削除するとArrayList<GenericNode> genericNodes;、デシリアライズが例外で失敗します。

の名前またはエントリ属性を定義していないため、問題が発生する可能性がありますgenericNodes。フレームワークはそれを適切にマップできません。どうすれば問題を解決できますか?

注: 1. AnnotationStratergy を使用しています

Serializer serializer = new Persister(new AnnotationStrategy());

2. マップする必要があるさまざまな種類のノードが 10 個のタグに近いため、ElementUnion 属性を使用したくありません

4

1 に答える 1

3

例外を投稿してください。そうしないと、問題の原因を特定するのが難しくなります。

  1. すべてのノードが閉じられていません!
  2. @ElementList(required = true, name = "mixture")可能ですgenericNodes

このコードを使用して、XML を正常に逆シリアル化しました。

GenericNodeクラス:

@org.simpleframework.xml.Root(strict = false)
@Convert(GenericNodeConverter.class)
public class GenericNode
{
    private String name;
    private int id;
    private String type;


    // ...
}

nameノード名 (nodeAまたはnodeB) が格納されるフィールドを追加しました。このフィールドは必須ではありません。

Rootクラス:

@org.simpleframework.xml.Root(strict = false, name = "root")
class Root
{
    @Element
    private String title;

    @Element
    private String desc;

    @ElementList(required = true, name = "mixture")
    ArrayList<GenericNode> genericNodes;

    // ...
}

そして、ここにコンバータがあります:

GenericNodeConverterクラス:

public class GenericNodeConverter implements Converter<GenericNode>
{
    @Override
    public GenericNode read(InputNode node) throws Exception
    {
        GenericNode gn = new GenericNode();

        gn.setId(Integer.valueOf(node.getAttribute("id").getValue()));
        gn.setType(node.getAttribute("type").getValue());
        gn.setName(node.getName());

        return gn;
    }


    @Override
    public void write(OutputNode node, GenericNode value) throws Exception
    {
        throw new UnsupportedOperationException("Not supported yet.");
    }
}

入力 XML:

(タグはすべて閉じています)

<root>
    <title> something </title>
    <desc> something more </desc>
     <mixture>
         <nodeA id="4" type="A"></nodeA>
         <nodeB id="5" type="B"></nodeB>
         <nodeB id="6" type="C"></nodeB>
         <nodeB id="7" type="D"></nodeB>
         <nodeB id="8" type="E"></nodeB>
         <nodeB id="9" type="F"></nodeB>
    </mixture>
</root>

これはうまくいきます。

タグが閉じられていないため、コンバーターが呼び出されないと思います。

于 2013-07-16T20:42:09.763 に答える