【问题标题】:Convert XML file into an XML object having a List [duplicate]将 XML 文件转换为具有列表的 XML 对象 [重复]
【发布时间】:2012-12-08 21:21:59
【问题描述】:

可能重复:
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"

【问题讨论】:

  • @everyone 我已经把我的问题简化了,这样我就能得到答案。
  • @Kazekage Gaara 这只是我的问题。让它更简单。
  • @Thinker 人们来这里不是为了给别人完整的答案,而是为了帮助彼此找到方法
  • 我问我哪里错了。我已经给了我的测试课。
  • 您需要将 package-info.java 放入您生成的 jaxb 包中。

标签: java xml xml-parsing jaxb unmarshalling


【解决方案1】:

更新

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;
    }

}

更多信息


完整示例

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/Output

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

更多信息

【讨论】:

    【解决方案2】:

    我可以看到两个问题:

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

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

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

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

    【讨论】:

    • 这是对的。我已经更改了变量名。忘记在测试类中更改它。
    • 我无法重现您的错误,因为您尚未发布所有代码。你也有一个叫做cts()的方法吗?如果是这样,请尝试将其重命名为其他名称。
    • no.这是我的全部代码。除了此代码之外,只有 getter 和 setter。显示的错误是因为它在 xml 文件中有两个 cts
    • 不,我已经运行了您发布的代码,它对我有用。根据错误,您在类中有两个名为cts 的属性。它与您的 xml 没有任何关系。
    • 代码在您的系统中运行没有错误?
    【解决方案3】:

    您的 XML 如下所示:

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

    但考虑到您的映射,它应该如下所示:

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

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

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

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

    【讨论】:

    • 仅供参考 - 您可以利用 @XmlValue 注释将对象模型映射到 @Thinker 给出的 XML:stackoverflow.com/a/13988362/383861
    • 感谢 Blaise 的提示!我不知道@XMLValue
    【解决方案4】:

    您可以尝试以下方法,

    如果可以,请将 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;
       }
    }
    

    【讨论】:

    猜你喜欢
    • 2013-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-25
    • 2015-10-06
    • 2017-11-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多