将 XML 文件转换为具有列表的 XML 对象 [重复]

Posted

技术标签:

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

可能重复:Best XML parser for JavaHow 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 包中。 【参考方案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;
    


更多信息

http://blog.bdoughan.com/2011/06/using-jaxbs-xmlaccessortype-to.html

完整示例

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>

更多信息

http://blog.bdoughan.com/2011/06/jaxb-and-complex-types-with-simple.html

【讨论】:

【参考方案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:***.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;
   

【讨论】:

仅供参考 - 您可以利用 @XmlValue 注释将对象模型映射到 @Thinker 给出的 XML:***.com/a/13988362/383861

以上是关于将 XML 文件转换为具有列表的 XML 对象 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

将对象列表转换为 xml 字符串

如何将 XML 转换为具有二进制数据内容的 Json

将 XML 转换为 c# 对象

将列表转换为 XML

如何将 XML 节点内容转换为 VBA 中的字符串?

无法将类型为“System.Xml.XmlComment”的对象强制转换为类型“System.Xml.XmlElement”