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到一个列表中。但是我定义的自定义转换器没有被调用。如果我删除属性然后反序列requiredArrayList<GenericNode> genericNodes;失败并出现异常。

可能是问题是因为我没有为genericNodes. 框架未能正确映射它。我该如何解决这个问题?

注意:1.我正在使用AnnotationStratergy

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

2. 我不想使用 ElementUnion 属性,因为我需要映射的不同类型的节点接近 10 个标签

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节点名称(nodeAnodeB)的附加字段。该字段不是必需的。

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 回答