如何在标签内查询 XML?
How to query XML inside a tag?
我正在尝试使用下面 xml
中的 attribute 标签查询位置值。我该怎么做?
我当前查询仅 returns full 属性标签的值,但我只想要位置的值,在本例中为 "sampleLocation"?
即:location="sampleLocation"
XML:
<Products>
<Product>
<name>Sample name</name>
<attribute id="sampleid" location="sampleLocation" type="sampleType"/>
</product>
</Products>
当前代码:
public String getLocationByName(String name) {
final String nameToQueryFor = name;
return engine.new Query<String>(MY_COLLECTION) {
@Override
protected String query(Collection collection) throws Exception {
XQueryService service = queryService();
ResourceSet resourceSet = service.query(
format("//Products/Product[name='%s']" +
"/attribute"
, StringEscapeUtils.escapeXml(nameToQueryFor)
));
List<String> results = newArrayList();
for (String resource : new IterableStringResources(resourceSet)) {
results.add(resource);
}
return results.get(0);
}
}.execute();
}
[为 'location' 编辑 + 更正]
"//Products/Product/name[text()=%s]/next-sibling::attribute/attribute::location"
翻译:在 //Products/Product
select 的上下文中,元素 <name>
具有给定的文本。然后获取具有 <attribute>
类型的下一个兄弟元素,从中获取 location
属性(该元素的)
的值
'xpath location paths'straight from the horse's mouth的一些例子。
我的建议是
//Product[child::name/text()={$nameToQueryFor}]/attribute/@location
这仅在变量绑定到元素类型的值时有效
我能够使用以下查询解决此问题:
"//Products/Product[name='%s']/attribute/@Location/string()"
哪个returns:"sampleLocation"
注意:最后没有使用 /string()
会给出错误:
attribute 'Location' has no parent element
我正在尝试使用下面 xml
中的 attribute 标签查询位置值。我该怎么做?
我当前查询仅 returns full 属性标签的值,但我只想要位置的值,在本例中为 "sampleLocation"?
即:location="sampleLocation"
XML:
<Products>
<Product>
<name>Sample name</name>
<attribute id="sampleid" location="sampleLocation" type="sampleType"/>
</product>
</Products>
当前代码:
public String getLocationByName(String name) {
final String nameToQueryFor = name;
return engine.new Query<String>(MY_COLLECTION) {
@Override
protected String query(Collection collection) throws Exception {
XQueryService service = queryService();
ResourceSet resourceSet = service.query(
format("//Products/Product[name='%s']" +
"/attribute"
, StringEscapeUtils.escapeXml(nameToQueryFor)
));
List<String> results = newArrayList();
for (String resource : new IterableStringResources(resourceSet)) {
results.add(resource);
}
return results.get(0);
}
}.execute();
}
[为 'location' 编辑 + 更正]
"//Products/Product/name[text()=%s]/next-sibling::attribute/attribute::location"
翻译:在 //Products/Product
select 的上下文中,元素 <name>
具有给定的文本。然后获取具有 <attribute>
类型的下一个兄弟元素,从中获取 location
属性(该元素的)
'xpath location paths'straight from the horse's mouth的一些例子。
我的建议是
//Product[child::name/text()={$nameToQueryFor}]/attribute/@location
这仅在变量绑定到元素类型的值时有效
我能够使用以下查询解决此问题:
"//Products/Product[name='%s']/attribute/@Location/string()"
哪个returns:"sampleLocation"
注意:最后没有使用 /string()
会给出错误:
attribute 'Location' has no parent element