我正在尝试使用Jaxb unmarshalling将XML文件转换为Java对象。
public static void main(String[] args) {
String input = "<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd\">"+
" <key>1</key>" +
"<income>100.335</income>" +
"</project>" ;
NexusClient c1 = new NexusClient();
c1.getObject(input);
}
/*********/
public boolean getObject(String input) {
InputSource inputSource = new InputSource(new StringReader(input));
System.out.println(inputSource);
try {
JAXBContext jaxbContext = JAXBContext
.newInstance(mavenEntity.class);
Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
mavenEntity mavenObject = (mavenEntity) jaxbUnmarshaller
.unmarshal(inputSource);
System.out.println("Success"+mavenObject.getIncome());
} catch (JAXBException e) {
System.out.println("Unable to parse the XML Context");
e.printStackTrace();
return false;
}
return true;
}
我在尝试提取“收入”标签信息时遇到了问题。我无法使用Jaxb提取正确的值。我的pojo课程是:
@XmlRootElement(name = "project", namespace = "http://maven.apache.org/POM/4.0.0")
@XmlAccessorType(XmlAccessType.FIELD)
public class mavenEntity {
@XmlElement(name = "key", type = String.class)
private String key;
@XmlElement(name = "income", type = String.class)
private String income;
public String getKey() {
return key;
}
public void setKey(String key) {
this.key = key;
}
public String getIncome() {
return income;
}
public void setIncome(String income) {
this.income = income;
}
}
我将Null作为XML中任何标记的输出。我想在XML Annotation中我的名字空间存在一些问题。但我真的不明白它是什么。在发布之前,我通过引用类似于this的几个链接做了一些基础但仍然我的结果不正确。有人可以帮我吗。
答案 0 :(得分:2)
模型中的命名空间限定与文档不匹配。您可以使用@XmlRootElement
在包级别指定命名空间限定,而不是在@XmlElement
和@XmlSchema
的所有实例上指定命名空间。
<强> package-info.java 强>
@XmlSchema(
namespace = "http://maven.apache.org/POM/4.0.0",
elementFormDefault = XmlNsForm.QUALIFIED)
package org.example.foo;
import javax.xml.bind.annotation.XmlNsForm;
import javax.xml.bind.annotation.XmlSchema;
<强> mavenEntity.java 强>
我已从此课程中删除了不必要的注释(请参阅:http://blog.bdoughan.com/2012/07/jaxb-no-annotations-required.html)。
package org.example.foo;
import javax.xml.bind.annotation.XmlSchema;
@XmlRootElement(name = "project")
@XmlAccessorType(XmlAccessType.FIELD)
public class mavenEntity {
private String key;
private String income;
}
了解更多信息
答案 1 :(得分:1)
您还需要将namespace
添加到@XmlElement
带注释的字段
@XmlElement(name = "key", namespace = "http://maven.apache.org/POM/4.0.0")
private String key;
@XmlElement(name = "income", namespace = "http://maven.apache.org/POM/4.0.0")
private String income;
那是因为你的根元素有一个特定的命名空间。由于嵌套元素没有名称空间前缀,因此它们使用的是根。我想这是JAXB所必需的。