【问题标题】:parse xml string using jaxb使用 jaxb 解析 xml 字符串
【发布时间】:2016-08-27 11:47:53
【问题描述】:

我正在尝试使用 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());

【问题讨论】:

    标签: java xml jaxb


    【解决方案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,您可以考虑使用XPath

    【讨论】:

      【解决方案2】:

      简化代码的一种方法是使用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 的好文章,描述了如何使用其功能简化代码。

      【讨论】:

        猜你喜欢
        • 2014-11-21
        • 1970-01-01
        • 2012-12-25
        • 2016-02-05
        • 2017-05-07
        • 2015-03-25
        • 2010-12-23
        • 1970-01-01
        相关资源
        最近更新 更多