我下面有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)
这个问题困扰了我整整一天。 任何帮助都将不胜感激。
答案 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(" ");
}
}