0

XStream を使用して Object から XML への変換フォームの xml ルート要素を無視できるかどうか、またはルート要素を他の要素に置き換える方法があるかどうかは疑問です。

カスタムのランタイム作成オブジェクトを XML に解析する関数があります。次のようなものです。

public static String entityToXML(GenericResponseObject entity) {
    XStream xstream = new XStream(new StaxDriver());

    xstream.autodetectAnnotations(true);
    xstream.registerConverter(new GenericResponseAttributeConverter());
    String xml = xstream.toXML(entity);

    return xml;
}

このために、私は混乱しました:

私は GenericResponseObject と GenericResponseAttribute クラスを持っています。アイデアは、実行時に必要な数のカスタム属性を持つオブジェクトを持つことです:

@XStreamAlias("objectResult")
public class GenericResponseObject {

    @XStreamAlias("attributes")
    @XStreamImplicit
    private ArrayList<GenericResponseAttribute> attributes;

    public GenericResponseObject() {
        this.attributes = new ArrayList();
    }

    public void addAttribute(String name, Object value) {
        this.attributes.add(new GenericResponseAttribute(name, value));
    }
}

そしてクラス GenericResponseAttribute:

@XStreamAlias("attribute")
public class GenericResponseAttribute {

    private String name;
    private Object value;

    public GenericResponseAttribute(String name, Object value) {
        this.name = name;
        this.value = value;
    }

    public String getName() {
        return this.name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Object getValue() {
        return this.value;
    }

    public void setValue(Object value) {
        this.value = value;
    }
}

ご覧のとおり、すべてのクラスにはエイリアシングと暗黙のリスト用の XStream 注釈があります。そのため、GenericResponseAttribute クラス用に作成したカスタム コンバーターをお見せしましょう。

public class GenericResponseAttributeConverter implements Converter {

    @Override
    public boolean canConvert(Class type) {
        return type.equals(GenericResponseAttribute.class);
    }

    @Override
    public void marshal(Object o, HierarchicalStreamWriter writer, MarshallingContext mc) {
        GenericResponseAttribute value = (GenericResponseAttribute)o;
        writer.startNode(value.getName());
        mc.convertAnother(value.getValue());
        writer.endNode();
    }

    @Override
    public Object unmarshal(HierarchicalStreamReader reader, UnmarshallingContext uc) {
        throw new UnsupportedOperationException("Not supported yet.");
    }
}

したがって、実行時に GenericResponseObject を構築し、それを静的メソッドで XML に解析すると、K は次のようになります。

response = new GenericResponseObject();
response.addAttribute("user", "alex");
response.addAttribute("otherAtt", "TEST");
System.out.println(XMLUtil.entityToXML(response));

println() 関数の結果は次のとおりです。

<objectResult>
    <attribute>
        <user>hugo</user>
    </attribute>
    <attribute>
        <otherAtt>TEST</otherAtt>
    </attribute>
</objectResult>

これはほとんど私が望んでいるものですが、GenericResponseAttribute クラスのルート要素を省略する必要があります。上に示したルート ノードについては、常に 1 つのノードのみが存在する必要があると言うことが重要です。属性値の内容。したがって、現在の要素を削除すると、常にルート要素になります。たとえば、以前の XML に必要な結果は次のとおりです。

<objectResult>
    <user>hugo</user>
    <otherAtt>TEST</otherAtt>
</objectResult>

私のニーズはかなり基本的なものですが、それを正しくする方法がわかりません。検索したところ、HierarchicalStreamWriter クラスに deletRootNode() または replaceRootNode() のようなメソッドがないようで、@XStreamNoRoot または @XStreamMakeRoot アノテーションはありません。 GenericResponseAttribute で使用できるので、ここで尋ねているのはそのためです。これを行う方法を知っている場合は助けてください。

ありがとう。

4

2 に答える 2

2

オブジェクトをXMLに解析した後、文字列置換を使用することになった瞬間、つまり、次のようになります。

public static String entityToXML(Object entity) {
    XStream xstream = new XStream(new StaxDriver());

    xstream.autodetectAnnotations(true);
    xstream.registerConverter(new GenericResponseAttributeConverter());
    String xml = xstream.toXML(entity);

    xml = xml.replace("<attribute>", "");
    xml = xml.replace("</attribute>", "");

    return xml;
}

しかし、それはかなりクールな解決策ではありません。別の解決策がある場合は、教えてください。

ありがとう。

于 2012-11-12T17:22:45.153 に答える