将XML转换为Java对象时获取不正确的值

时间:2013-12-09 15:45:33

标签: java xml jaxb

我正在尝试使用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的几个链接做了一些基础但仍然我的结果不正确。有人可以帮我吗。

2 个答案:

答案 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所必需的。

一些替代方案和/或解释herehere