4

次のような REST サービスから XML を取得しています。

<entity>
  <foo>
    <count>1</count>
    <date>1970-01-01</date>
    <margin>78.67</margin>
  </foo>
  <bar>
    <count>2</count>
    <date>1450-09-17</date>
    <margin>24.56</margin>
  </bar>
  <baz>
    <count>11</count>
    <date>1968-11-12</date>
    <margin>98.76</margin>
  </baz>
</entity>

そして、次のクラス Entity.java で解析しています。

@XmlRootElement(name = "entity")
@XmlAccessorType(XmlAccessType.FIELD)
public class Entity implements Serializable {

  @XmlElements({
        @XmlElement(name="foo"),
        @XmlElement(name="bar"),
        @XmlElement(name="baz")
  })
  private List<EntityElement> entityElements;
....

次のような EntityElement クラスを使用します。

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class EntityElement implements Serializable {
    @XmlElement(required = true)
    private int count

    @XmlElement(required = true)
    private String date;

    @XmlElement(required = false)
    private long margin;
....

これはすべて期待どおりに機能し、EntityElements のリストを取得します。私がやりたいのは、名前フィールドを追加して、見つかった要素の名前 (foo、bar、または baz) を入力することですが、これを行う方法がわかりません。ヘルプや提案をいただければ幸いです。

4

1 に答える 1

2

注: 私はEclipseLink JAXB (MOXy)のリーダーであり、JAXB (JSR-222)エキスパート グループのメンバーです。

@XmlVariableNodeこのユース ケースでは、EclipseLink 2.5.1 で MOXy に追加した を使用できます。

Java モデル

実在物

フィールドではMOXyを使用@XmlVariableNodeentityElementsます。フィールドでは、要素名を表すターゲット クラスのフィールドを指定します。

import java.io.Serializable;
import java.util.List;
import javax.xml.bind.annotation.*;
import org.eclipse.persistence.oxm.annotations.XmlVariableNode;

@XmlRootElement(name = "entity")
@XmlAccessorType(XmlAccessType.FIELD)
public class Entity implements Serializable {

    @XmlVariableNode("name")
    private List<EntityElement> entityElements;

}

エンティティ要素

@XmlTransient注釈を使用して、nameフィールドの値が子要素としてマーシャリングされないようにします。

import java.io.Serializable;
import javax.xml.bind.annotation.*;

@XmlAccessorType(XmlAccessType.FIELD)
public class EntityElement implements Serializable {

    @XmlTransient
    private String name;

    @XmlElement(required = true)
    private int count;

    @XmlElement(required = true)
    private String date;

    @XmlElement(required = false)
    private long margin;

}

jaxb.properties

MOXy を JAXB プロバイダーとして指定するにはjaxb.properties、次のエントリを使用して、ドメイン モデルと同じパッケージで呼び出されるファイルを含める必要があります ( http://blog.bdoughan.com/2011/05/specifying-eclipselink-moxy-asを参照)。 -your.html )。

javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory

デモコード

デモ

MOXy は JAXB (JSR-222) 実装であるため、標準のランタイム API のみが必要です。

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

public class Demo {

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

        Unmarshaller unmarshaller = jc.createUnmarshaller();
        File xml = new File("src/forum19194567/input.xml");
        Entity entity = (Entity) unmarshaller.unmarshal(xml);

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

}

input.xml/出力

これは、質問の XML ドキュメントです。

<?xml version="1.0" encoding="UTF-8"?>
<entity>
   <foo>
      <count>1</count>
      <date>1970-01-01</date>
      <margin>0</margin>
   </foo>
   <bar>
      <count>2</count>
      <date>1450-09-17</date>
      <margin>0</margin>
   </bar>
   <baz>
      <count>11</count>
      <date>1968-11-12</date>
      <margin>0</margin>
   </baz>
</entity>

詳細については

于 2013-10-05T10:21:51.930 に答える