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/