我有以下XML
:
<Details>
<Detail>
<name>Detail one</name>
<id>001</id>
</Detail>
<Detail>
<name>Detail two</name>
<id>002</id>
</Detail>
</Details>
我通过姓名查询,使用XQuery
服务Java
方法获取ID:
public String getIdByName(String detailName) {
final String detail_Name = detailName;
return engine.new Query<String>(DETAILS_COLLECTION) {
@Override
protected String query(Collection collection) throws Exception {
XQueryService service = queryService();
ResourceSet resourceSet = service.query(
format("//Details/Detail[name='%s']" +
"/id/text()"
, StringEscapeUtils.escapeXml(detailName)
));
List<String> ids = newArrayList();
for (String resource : new IterableStringResources(resourceSet)) {
instanceLocations.add(resource);
}
return ids.get(0);
}
}.execute();
}
此方法正确返回此XML
部分的ID,其名称为“Detail one”:
<Detail>
<name>Detail one</name>
<id>001</id>
<Detail>
但不会返回名称为“详情二”的第二个值:
<Detail>
<name>Detail two</name>
<id>002</id>
</Detail>
导致这种情况的原因是什么?
答案 0 :(得分:3)
你的代码看起来没什么错误,所以我怀疑你的输入。您可以在运行查询之前尝试对其进行清理:
"//Details/Detail[name=fn:normalize-space('%s')]"
但是,这只能解决空白问题。你仍然需要确保没有拼写错误或意外的标点符号。
答案 1 :(得分:0)
你现在可能有点迟了但最后的回复声明:
return ids.get(0);
具体是要求索引0。
如果您将其更改为:
return ids;
应该将它们全部归还给第一个索引。
我遇到了类似的问题,这就是为什么我偶然发现了这个问题。