我正在尝试使用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());
答案 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
的好文章。