1

JAXB以下を解析するために使用しようとしていますXML。不要な部分を削除しました。残念ながら、オリジナルXMLはサード パーティのアプリケーションによって生成されたものであり、DTDまたはXSDファイルを使用できないため、JAXBコードを手作業で作成しています。

<add>
  <add-attr attr-name="UserName">
    <value type="string">User1</value>
  </add-attr>
  <add-attr attr-name="Name">
    <value type="structured">
      <component name="familyName">Doe</component>
      <component name="givenName">John</component>
    </value>
  </add-attr>
</add>

問題はもちろん<value>要素です。これは、プレーン テキストの要素、またはその属性タイプが「構造化された<component>要素のリスト」の場合です。

JAXB2 つのオプションを実装する 2 つのクラス (value1 と value2) を作成しましたが、要素の名前がどちらも「value」であるため、どちらを使用すればよいかわかりません。解決策はありますか?

4

2 に答える 2

2

オプション #1 - 1 つの値クラス

で注釈が付けられValueたプロパティを含むクラスを1 つ持つことができます。String@XmlMixed

package forum13232991;

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

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Value {

    @XmlAttribute
    String type;

    @XmlMixed
    List<String> value;

    @XmlElement(name="component")
    List<Component> components;

}

オプション #2 - 複数の値クラスXmlAdapter

それらを別々のクラスにしたい場合はXmlAdapter、これを利用できます:

バリューアダプター

package forum13232991;

import javax.xml.bind.annotation.adapters.XmlAdapter;

public class ValueAdapter extends XmlAdapter<Value, Object> {

    @Override
    public Value marshal(Object object) throws Exception {
        Value value = new Value();
        if(object instanceof StructuredValue) {
            StructuredValue structuredValue = (StructuredValue) object;
            value.type = "structured";
            value.components = structuredValue.components;
        } else {
            StringValue stringValue = (StringValue) object;
            value.value.add(stringValue.value);
        }
        return value;
    }

    @Override
    public Object unmarshal(Value value) throws Exception {
        if("string".equals(value.type)) {
            StringValue stringValue = new StringValue();
            StringBuilder strBldr = new StringBuilder();
            for(String string : value.value) {
                strBldr.append(string);
            }
            stringValue.value = strBldr.toString();
            return stringValue;
        } else {
            StructuredValue structuredValue = new StructuredValue();
            structuredValue.components = value.components;
            return structuredValue;
        }
    }

}

追加属性

package forum13232991;

import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;

public class AddAttr {

    @XmlJavaTypeAdapter(ValueAdapter.class)
    Object value;

}

詳細については

于 2012-11-05T13:25:56.120 に答える
1

1 つの方法は、type 属性に基づいて値要素に xsi:type 属性を追加する XSL 変換を作成することです。次に、すべての Value 要素が同じ BaseValue クラスから拡張され、add-attr 要素がこの BaseValue への参照を持つことができます。

于 2012-11-05T13:30:14.893 に答える