【问题标题】:Unmarshalling to an array or arrayList in Java在 Java 中解组到数组或 arrayList
【发布时间】:2015-05-29 10:08:13
【问题描述】:

我试图在解组和 xml 文件后填充一个数组列表,但它解组到一个对象,我怎样才能将每个单独的项目取出并复制到其他东西,如数组?

我可以编组和解组,但除了一些内存地址等之外,无法从对象中获取任何内容。

这里是解组

try {

            File file = new File("xmlFiles/ipAdresses.xml");
            JAXBContext jaxbContext = JAXBContext.newInstance(IpAdressXmlHandler.class);

            Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
            IpAdressXmlHandler xmlList = (IpAdressXmlHandler) jaxbUnmarshaller.unmarshal(file);
            System.out.println(xmlList);

          } catch (JAXBException e) {
            e.printStackTrace();
          }

如何获取 xmlList 作为数组?或者我怎样才能把所有东西都拿出来?

IpAdressXmlHandler 类:

@XmlRootElement
public class IpAdressXmlHandler {


private String ipAdress;

@XmlElement
public String getIpAdress() {
    return ipAdress;
}


public void setIpAdress(String ipAdress) {
    this.ipAdress = ipAdress;
}

更新:xml 文件:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ipAdressXmlHandler>
<ipAdress>localhost</ipAdress>
</ipAdressXmlHandler>

稍后会有多个 IP 地址,我需要将它们放在一个数组或数组列表中

【问题讨论】:

  • 您可能应该向我们提供您要从中解组的 XML 文件!
  • 请检查我的更新

标签: java xml jaxb marshalling unmarshalling


【解决方案1】:
public class IpAdressXmlHandler {

@XmlElement(name="ipAdress")
private String ipAdress;

public String getIpAdress() {
    return ipAdress;
}


public void setIpAdress(String ipAdress) {
    this.ipAdress = ipAdress;
}

@XmlRootElement(name="ipAdressXmlHandler")
public class IpAdressListXmlHandler {

@XmlElement(name="ipAdress")
private List<IpAdressXmlHandler> ipAdress;


public List<IpAdressXmlHandler> getIpAdressList() {
    return ipAdress;
}


public void setIpAdressList(List<IpAdressXmlHandler> ipAdress) {
    this.ipAdress = ipAdress;
}

使用 IpAdressListXmlHandler 类进行解组..

【讨论】:

  • 我必须定义 IpAdressListXmlHandler 吗?它不编译
  • 错误 com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException: 2 个 IllegalAnnotationExceptions 计数
  • 我只是写了一个代码你检查一下..这是正确的方法..检查link
  • 它返回 IpAdressListXmlHandler 对象。然后使用 getIpAdressList() 获取 ipaddress。
  • 我收到了 2 次 IllegalAnnotationExceptions
【解决方案2】:

IpAdressXmlHandler 是代表您的XML 的实体,只要在此XMLXSD 定义中只允许一个标签,您就永远不会得到List

解决方案
您的 XSD 定义必须有 maxoccurs="otbounded" 或类似的,以允许各种 &lt;IpAdressXmlHandler&gt; 标签。完成后,JaxB 将自动生成 getter,返回 List&lt;IpAdressXmlHandler&gt;

更新
IMO 我会根据您的 xml 规范创建一个 XSD 文件...将其放入您的工作区和 Right click &gt; Generate &gt; JaxB classes

如果您想获得List&lt;IpAdressXmlHandler&gt;,您必须为包含List&lt;IpAdressXmlHandler&gt; 的xml 创建一个包装器并返回它,但您必须解组包装器,而不是IpAdressXmlHandler

类似:

class IpWrapper{

    private List<IpAdressXmlHandler> ipList;   

    @XmlElement
    public List<IpAdressXmlHandler> getIpAdressXmlHandler() {
        return ipList;
    }
}

还有:

JAXBContext jaxbContext = JAXBContext.newInstance(IpWrapper.class);
Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();

【讨论】:

  • 我是个新手,不知道你的意思。我应该改变什么?很久了。非常感谢
  • IpAdressXmlHandler 是由 JaxB 自动生成的,对吧?您必须更改使JaxB 创建此类的文件的定义,通常是一个XSD 文件,它定义了XML 的允许标签和内容
  • IpAdressXmlHandler 是我创建的类,我将它编组到 xml 文件中,检查我的更新
猜你喜欢
  • 2018-11-26
  • 2023-03-31
  • 2017-01-18
  • 2015-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-18
相关资源
最近更新 更多