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”

默认情况下,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;
    }

}

了解更多信息


完整示例

中旅

您可以使用@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);
    }

}

输入.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

我可以看到两个问题:

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 回答
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;
 }
于 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 回答