如何将自定义嵌套列表xml转换为相应的Java对象

时间:2019-05-16 16:33:14

标签: java jaxb marshalling unmarshalling

我下面有XML-

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<objectWithList>
    <MyList>
        <abc>hi</abc>
        <list>Somewhere</list>
        <list>This and that</list>
        <list>Something</list>
    </MyList>
</objectWithList>

我想使用jaxb unmarshaller转换为java对象。

用于xml映射的Java文件-

@XmlRootElement
public class ObjectWithList {
    @XmlElement
    private String abc;
    private List<String> list;
    @XmlElementWrapper(name="MyList")
    @XmlElement
    public List<String> getList() {
        return list;
    }
    public void setList(List<String> list) {
        this.list = list;
    }

}

用于转换的主驱动程序类代码-

public class Test {
    public static void main(String[] args) throws JAXBException {
        JAXBContext jaxbContext = JAXBContext.newInstance(ObjectWithList.class);
        Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
        ObjectWithList emps = (ObjectWithList) jaxbUnmarshaller.unmarshal(new File("c:/emp.xml"));
        for (String s : emps.getList()) {
            System.out.println(s);
        }
        System.out.println(" ");
    }

}

但是这不起作用。我收到以下异常-

Exception in thread "main" javax.xml.bind.UnmarshalException
 - with linked exception:
[org.xml.sax.SAXParseException; systemId: file:/c:/emp.xml; lineNumber: 1; columnNumber: 10; The processing instruction target matching "[xX][mM][lL]" is not allowed.]
    at javax.xml.bind.helpers.AbstractUnmarshallerImpl.createUnmarshalException(AbstractUnmarshallerImpl.java:335)
    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.createUnmarshalException(UnmarshallerImpl.java:563)
    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal0(UnmarshallerImpl.java:249)
    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal(UnmarshallerImpl.java:214)
    at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:157)
    at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:162)
    at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:171)
    at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:189)
    at com.netspend.idology.Test.main(Test.java:12)
Caused by: org.xml.sax.SAXParseException; systemId: file:/c:/emp.xml; lineNumber: 1; columnNumber: 10; The processing instruction target matching "[xX][mM][lL]" is not allowed.
    at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.createSAXParseException(ErrorHandlerWrapper.java:203)
    at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.fatalError(ErrorHandlerWrapper.java:177)
    at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:400)
    at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:327)

这个问题困扰了我整整一天。 任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:1)

请在下面找到有效的修改程序。另外,您还必须了解类结构的用法和在适当位置的注释的用法。

import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlElementWrapper;
import javax.xml.bind.annotation.XmlRootElement;
import java.util.List;

@XmlRootElement
public class ObjectWithList {

  private MyList myList;

  @XmlElement(name = "MyList")
  public MyList getMyList() {
    return myList;
  }

  public void setMyList(MyList myList) {
    this.myList = myList;
  }

  @Override
  public String toString() {
    return "ObjectWithList{" + "myList=" + myList + '}';
  }
}



import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import java.util.List;

@XmlRootElement(name = "MyList")
public class MyList {

  private String abc;

  private List<String> list;

  @XmlElement(name = "abc")
  public String getAbc() {
    return abc;
  }

  public void setAbc(String abc) {
    this.abc = abc;
  }

  @XmlElement(name = "list")
  public List<String> getList() {
    return list;
  }

  public void setList(List<String> list) {
    this.list = list;
  }

  @Override
  public String toString() {
    return "MyList{" + "abc='" + abc + '\'' + ", list=" + list + '}';
  }
}



import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Unmarshaller;
import java.io.File;
import java.util.List;

public class Test {
  public static void main(String[] args) throws JAXBException {
    JAXBContext jaxbContext = JAXBContext.newInstance(ObjectWithList.class);
    Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
    ObjectWithList emps =
        (ObjectWithList)
            jaxbUnmarshaller.unmarshal(
                new File("D:/someFolder/emp.xml"));
    for (String s : emps.getMyList().getList()) {
      System.out.println(s);
    }
    System.out.println(emps);
    System.out.println(" ");
  }
}