2

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 元素。另一个没有设置(即空)。虽然没有错误。我应该如何更好地注释这些类?

更长的 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)。

4

2 回答 2

2

注意:我是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;

    ....

}

了解更多信息

于 2013-08-08T19:43:39.990 回答
1

更改行:

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

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

至:

@XmlElement(name="int")
private List<IntegerElement> intElements;

这样所有int元素都将在列表中解组。

然后获取值遍历列表:

for(IntegerElement intEl : intElements){
    System.out.println(intEl.getName() + " = " + intEl.getValue());
}

编辑:

如果要在 Jaxb 中使用继承,请使用以下注释(作为由andIElement实现的接口):IntegerElementStringElement

@XmlElementWrapper( name = "lst" )
@XmlElements( { 
    @XmlElement( name="int", type = IntegerElement.class ),
    @XmlElement( name="str", type = StringElement.class)
    } )
private List<IElement> elements;
于 2013-08-08T19:22:41.467 回答