将XML文件转换为具有List的XML对象

时间:2012-12-21 09:45:07

标签: java xml xml-parsing jaxb unmarshalling

  

可能重复:
  Best XML parser for Java
  How i can convert this xml file into an XML object?

我有这样的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 个答案:

答案 0 :(得分:4)

<强>更新

  

com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException:2   IllegalAnnotationExceptions类的计数有两个属性   同名“cts”

默认情况下,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方法。

@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>

了解更多信息

答案 1 :(得分:0)

我可以看到两个问题:

1)您需要在P1.class中使用JAXBContext。你还没有说Presentation类是什么,但如果你的根元素是P1,那就是你在上下文中需要的东西:

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

2)您需要指定根xml元素的名称:

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

答案 2 :(得分:0)

您的XML如下所示:

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

但考虑到你的映射,它应该是:

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

为了将根元素从p1更改为P1,请使用name中的属性@XmlRootElement

如果要解析您发布的第一个XML版本,请更改您的P1类:

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

答案 3 :(得分: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;
   }
}