java - 使用 JAXB 解析 Solr 状态响应 XML

标签 java xml solr jaxb unmarshalling

Solr 以以下 XML 形式返回状态信息(这是缩短版本):

<?xml version="1.0" encoding="UTF-8"?>
<response>
    <lst name="responseHeader">
        <int name="status">0</int>
        <int name="QTime">2</int>
    </lst>
</response>

我想将其放入我的 Java 应用程序中。我创建了以下代码:

@XmlRootElement(name="response")
@XmlAccessorType(XmlAccessType.FIELD)
public class Response {

    @XmlElement(name="lst")
    private ResponseHeader responseHeader;

    public ResponseHeader getResponseHeader() {
        return responseHeader;
    }

    public void setResponseHeader(ResponseHeader responseHeader) {
        this.responseHeader = responseHeader;
    }

    public Response() {}
}

代表根元素,

@XmlAccessorType(XmlAccessType.FIELD)
public class ResponseHeader {

    @XmlElement(name="int")
    private IntegerElement status;

    @XmlElement(name="int")
    private IntegerElement QTime;

    ....

}

查看里面的代码。最后,这是 int 字段:

@XmlAccessorType(XmlAccessType.FIELD)
public class IntegerElement implements Serializable {

@XmlTransient
private static final long serialVersionUID = 1L;

@XmlAttribute
protected String name;

@XmlValue
private int value;

    ...

}

当我尝试解码上面的 xml 片段时,只有一个 int 元素被填充。另一个未设置(即 null)。不过没有错误。我应该如何更好地注释这些类?

较长的 XML 片段如下:

  <lst name="index">
    <int name="numDocs">0</int>
    <int name="maxDoc">0</int>
    <int name="deletedDocs">0</int>
    <long name="version">1</long>
    <int name="segmentCount">0</int>
    <bool name="current">true</bool>
    <bool name="hasDeletions">false</bool>
    <str name="directory">org.apache.lucene.store.NRTCachingDirectory:NRTCachingDirectory(org.apache.lucene.store.MMapDirectory@/home/marceau/Developer/Servers/solr/example/solr/collection1/data/index lockFactory=org.apache.lucene.store.NativeFSLockFactory@22bda240; maxCacheMB=48.0 maxMergeSizeMB=4.0)</str>
    <lst name="userData" />
    <long name="sizeInBytes">65</long>
    <str name="size">65 bytes</str>
  </lst>

我已经通过继承改编了 Benoit Wickramarachi 示例来生成此内容:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name="lst")
public class Index {

@XmlElementWrapper( name = "lst" )
@XmlElements( { 
    @XmlElement( name="int", type = IntegerElement.class ),
    @XmlElement( name="str", type = StringElement.class),
    @XmlElement( name="bool", type = BooleanElement.class),
    @XmlElement( name="date", type = DateElement.class),
    @XmlElement( name="long", type = LongElement.class),
    @XmlElement( name="lst", type = ListElement.class)
    } )
private List<ResponseElement> index;

public Index() {}

解码过程不会崩溃,但它只是创建一个 Index 对象,其中包含一个名为 index 的 ArrayList,该索引完全为空(调试器中有 10 个空值,大小为 0)。

最佳答案

注意:我是EclipseLink JAXB (MOXy) JAXB (JSR-222) 的领导者和成员专家组。

您可以使用 MOXy 的 @XmlPath 扩展来支持此用例:

import javax.xml.bind.annotation.*;
import org.eclipse.persistence.oxm.annotations.XmlPath

@XmlAccessorType(XmlAccessType.FIELD)
public class ResponseHeader {

    @XmlPath("int[1]")
    private IntegerElement status;

    @XmlPath("int[2]")
    private IntegerElement QTime;

    ....

}

了解更多信息

关于java - 使用 JAXB 解析 Solr 状态响应 XML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18134217/

相关文章:

java - 在java中获取 'program files'的通用方法?

c# - 如何使用 POSTin c# 发出 HTTP 请求并发送一些 xml 数据

Solr 字符串字段类型最大可索引字符数

python - 查找 XML 标记值并选择包含所请求标记值的父级

ios - 有什么方法可以从 iOs 中的 XML/HTML 模板生成 PDF 文件

hadoop - 无法确定动物园管理员整体健康状况

tomcat - java.lang.ClassNotFoundException : org. apache.http.entity.mime.content.ContentBody

java - 如何更改 JFrame 图标

java - 这段代码给了我一个不兼容的类型错误。它说它需要扫描仪但找到了字符串。我不明白如何解决它

java - 测试服务器日志。使用 Java、SocketHandler