使用jaxb解析xml字符串

时间:2016-08-27 11:47:53

标签: java xml jaxb

我正在尝试使用jaxb解析xml字符串。 实际上,我需要在文字中提取小数值。

那是XML字符串:

<results>
    <result>
      <binding name="value">
        <literal datatype="http://www.w3.org/2001/XMLSchema#decimal">369.0</literal>
      </binding>
    </result>
  </results>

我有一个java类结果:

package client;

import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement
public class Results {

    @XmlElement
    String result;

    @XmlElement
    Double binding;

    @XmlElement
    Double literal;
    public Double getLiteral()
    {
        return literal;
    }
    public Double geBinding() 
    {
        return binding;
    }
    public String getResult() 
    {
        return result;
    }

}

当我尝试打印该值时,我得到了null。那我怎样才能得到文字标记之间的小数值?

Results re=(Results) JAXBContext.newInstance(Results.class)
            .createUnmarshaller()
            .unmarshal(new StringReader(my_xml));

System.out.println(re.getLiteral());

2 个答案:

答案 0 :(得分:1)

您的Results类不会反映您尝试解析的XML的结构。 results元素由result元素组成,该元素又由binding组成,由literal组成。

要通过JAXB执行此操作,我们必须遵循类似的结构。

@XmlRootElement
public class Results {

    @XmlElement
    Result result;

    public Result getResult() {
        return result;
    }
}

public class Result {
    @XmlElement
    Binding binding;

    public Binding getBinding() {
        return binding;
    }
}

public class Binding {
    @XmlElement
    Double literal;

    public Double getLiteral() {
        return literal;
    }
}

要访问literal的值,我们可以像results.getResult().getBinding().getLiteral()一样调用getter。

但是,如果这是一次性的,并且您的应用程序不会大量处理XML,您可以考虑使用node-foreman

答案 1 :(得分:0)

简化代码的一种方法是使用MOXy EclipseLink's JAXB及其XmlPath注释,以便提供XPATH,以便您可以直接映射元素或属性内容到你的领域,允许避免为每个子元素增加一个类。

例如,在您的情况下,映射将是:

@XmlPath("result/binding/literal/text()")
Double literal;

您需要将此依赖项添加到项目中:

<dependency>
    <groupId>org.eclipse.persistence</groupId>
    <artifactId>eclipselink</artifactId>
    <version>2.6.3</version>
</dependency>

并明确指定要使用的上下文工厂,这要归功于在启动命令-Djavax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory中设置的系统属性

以下是一篇关于如何使用其功能简化代码的MOXy的好文章。