2

私はこのようなxmlドキュメントを持っています

<root>
<subElement>
    <a>an instance</a>
    <b>another instance</b>
    <problemElement>
      <option>1st instance</option>
      <option>2nd instance</option>
      <option>3rd instance</option>
    </problemElement>

</subElement>

<subElement>
    <a></a>
    <b></b>
    <problemElement>
      <option>instance</option>
    </problemElement>

</subElement>
</root>

私のjaxbクラスは次のようになります。

@XmlRootElement(name = "root")
@XmlType(name = "Root")
public class Root{

  @XmlElement(name = "subElement", required = true)
  private final List<SubElement> subElementList = new ArrayList<SubElement>();

  public List<SubElement> getSubElementList() {
    return subElementList;
  }
}



@XmlType(name = "SubElement", propOrder = {"a", "b", "problemElement"})
public abstract class SubElement{

  @XmlElement(required = true)
  private String a;

  @XmlElement(required = true)
  private String b;

  @XmlElement(name = "problemElement", required = true)
  private List<ProblemElement> problemElement= new ArrayList<ProblemElement>();

  public String getA() {
    return a;
  }

  public String getB() {
    return b;
  }

  public List<ProblemElement> getProblemElement() {
    return problemElement;
  }
}



@XmlType(name = "ProblemElement" )
public class ProblemElement {

  @XmlElement(required = true)
  private String option;


  public String getOption() {
    return option;
  }
}

problemElementを除いて、すべて正常に動作します。リストは、xmlの最後のオプションノード値(この場合は「3番目のインスタンス」)のみを返します。私は何が間違っているのですか?

4

2 に答える 2

3

短い答え

ユースケースでは、プロパティの@XmlElementWrapperアノテーションを活用します。problemElement

@XmlElementWrapper(name="problemElement")
@XmlElement(name="option")
private List<ProblemElement> problemElement = new ArrayList<ProblemElement>();

私は@XmlValueプロパティのプロパティを使用しoptionます:

  @XmlValue
  private String option;

長い答え

以下は完全にマッピングされた例です。

package forum10531285;

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

@XmlRootElement(name = "root")
@XmlType(name = "Root")
@XmlAccessorType(XmlAccessType.FIELD)
public class Root {

    @XmlElement(name = "subElement", required = true)
    private final List<SubElement> subElementList = new ArrayList<SubElement>();

}

SubElement

package forum10531285;

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

@XmlType(name = "SubElement", propOrder = { "a", "b", "problemElement" })
@XmlAccessorType(XmlAccessType.FIELD)
public class SubElement {

    @XmlElement(required = true)
    private String a;

    @XmlElement(required = true)
    private String b;

    @XmlElementWrapper(name="problemElement")
    @XmlElement(name="option")
    private List<ProblemElement> problemElement = new ArrayList<ProblemElement>();

}

ProblemElement

package forum10531285;

import javax.xml.bind.annotation.*;

@XmlType(name = "ProblemElement" )
@XmlAccessorType(XmlAccessType.FIELD)
public class ProblemElement {

  @XmlValue
  private String option;

}

デモ

package forum10531285;

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

public class Demo {

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

        Unmarshaller unmarshaller = jc.createUnmarshaller();
        File xml = new File("src/forum10531285/input.xml");
        Root root = (Root) unmarshaller.unmarshal(xml);

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

}

input.xml / Output

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<root>
    <subElement>
        <a>an instance</a>
        <b>another instance</b>
        <problemElement>
            <option>1st instance</option>
            <option>2nd instance</option>
            <option>3rd instance</option>
        </problemElement>
    </subElement>
    <subElement>
        <a></a>
        <b></b>
        <problemElement>
            <option>instance</option>
        </problemElement>
    </subElement>
</root>
于 2012-05-10T10:19:42.700 に答える
2

申し訳ありませんが...あなたのProblemElementには無数のオプションがあるかもしれませんか?その場合は、ProblemElementクラスの代わりにこれをコーディングする必要があります。

public class ProblemElement {
    private List<String> options;

    public List<String> getOptions() {
        return options;
    }
    // other stuff here
}

それ以外の場合、JAXBindingはXMLの最後のオプション(この場合は3番目)のみを取得します。もちろん、それに応じてバインディングアノテーションを書き直す必要があります。

于 2012-05-10T09:44:59.240 に答える