2

重複の可能性:
Java に最適な XML パーサー
この xml ファイルを XML オブジェクトに変換するにはどうすればよいですか?

私はこのようなXMLを持っています。そして、それをJAVAオブジェクトに変換したいです。

<P1>
    <CTS>
        Hello
    </CTS>
    <CTS>
        World
    </CTS>
<P1>    

そこで、プロパティを持つ次の Java クラスを作成しました。

P1 class

@XmlRootElement
public class P1 {
    @XmlElement(name = "CTS")
    List<CTS> cts;
}

CTS class

public class CTS {
    String ct;
}

Test Class

File file = new File("D:\\ContentTemp.xml");
            JAXBContext jaxbContext = JAXBContext.newInstance(P1.class);

            Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
            P1 p = (P1) jaxbUnmarshaller.unmarshal(file);

しかし、次のエラーが発生します-

com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException: 
2 counts of IllegalAnnotationExceptions
Class has two properties of the same name "cts"
4

4 に答える 4

4

アップデート

com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException: 2 カウントの IllegalAnnotationExceptions クラスには、同じ名前「cts」の 2 つのプロパティがあります

デフォルトでは、JAXB (JSR-222)実装は、プロパティと注釈付きフィールドに基づいてマッピングを作成します。プロパティもあるフィールドに注釈を付けると、このエラーが発生します。

オプション 1 - @XmlAccessorType(XmlAccessType.FIELD) を使用する

@XmlAccessorType(XmlAccessType.FIELD)クラスで指定する必要があるフィールドに注釈を付けることができます。

@XmlRootElement(name="P1)
@XmlAccessorType(XmlAccessType.FIELD)
public class P1 {

    @XmlElement(name = "CTS")
    List<CTS> cts;

}

オプション #2 - プロパティに注釈を付ける (get メソッド)

getまたは、メソッドに注釈を付けることもできます。

@XmlRootElement(name="P1)
public class P1 {

    List<CTS> cts;

    @XmlElement(name = "CTS")
    public List<CTS> getCts() {
        return cts;
    }

}

詳細については


完全な例

CTS

@XmlValue注釈を使用して、 Java クラスを単純なコンテンツを持つ複合型にマップできます。

@XmlAccessorType(XmlAccessType.FIELD)
public class CTS {

    @XmlValue
    String ct;

}

P1

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

@XmlRootElement(name="P1")
@XmlAccessorType(XmlAccessType.FIELD)
public class P1 {

    @XmlElement(name = "CTS")
    List<CTS> cts;

}

デモ

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

public class Demo {

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

        Unmarshaller unmarshaller = jc.createUnmarshaller();
        File xml = new File("src/forum13987708/input.xml");
        P1 p1 = (P1) unmarshaller.unmarshal(xml);

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

}

input.xml/出力

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<P1>
    <CTS>
        Hello
    </CTS>
    <CTS>
        World
    </CTS>
</P1>

詳細については

于 2012-12-21T10:28:19.420 に答える
0

XML は次のようになります。

<P1>
  <CTS>
    Hello
  </CTS>
  <CTS>
    World
  </CTS>
</P1>

ただし、マッピングを考慮すると、次のようになります。

<p1>
  <CTS>
    <CT>
    Hello
    </CT>
  </CTS>
  <CTS>
    <CT>
    World
    </CT>
  </CTS>
</p1>

ルート要素を p1 から P1 に変更するには、属性namefromを使用します@XmlRootElement

投稿した XML の最初のバージョンを解析する場合は、P1 クラスを次のように変更します。

@XmlRootElement(name="P1")
public class P1 {
    @XmlElement(name = "CTS")
    List<String> cts;
 }
于 2012-12-21T10:11:40.740 に答える
0

次のことを試すことができます。

可能であれば、次の構造の xml を作成してください。

<P1>
    <CTSList>
       <CTS value="Hello"/>
       <CTS value="World"/>
    </CTSList>
<P1>

そして使用して、

@XMLRootElement(name="P1")
public class P1 {
  List CTSList;

  @XMLElementWrapper(name="CTSList")
  @XMLELement(name="CTS")
  public void setCTSList(List<CTS> ctsList) {
     this.CTSList = ctsList;
  }

  public List<CTS> getCTSList() {
    return this.CTSList;
  }
}

@XMLRootElement(name="CTS")
public class CTS {
   String cts;

   @XMLAttribute(name = "value")
   public String getCts() {
     return this.cts;
   }

   public void set setCts(String cts) {
     this.cts = cts;
   }
}
于 2012-12-21T10:33:22.603 に答える
0

私が見ることができる2つの問題:

1) で使用する必要がありP1.classますJAXBContext。クラスが何であるかは述べていませんPresentationが、ルート要素がP1である場合、それがコンテキストで必要なものです。

JAXBContext jaxbContext = JAXBContext.newInstance(P1.class);

2) ルート xml 要素の名前を指定する必要があります。

@XmlRootElement(name="P1")
public class P1 {
...
于 2012-12-21T09:55:37.913 に答える