Я пытаюсь найти все имена элементов, которые соответствуют двум приведенным ниже правилам.
1. элементы должны иметь <set>erase</set>
2. если два или более элемента имеют иерархию <set>erase</set>
(например, <b>
и <d>
оба имеют <set>erase</set>
), то должно быть напечатано только имя родительского узла (т.е. <b>
в этом случае).
Таким образом, требуемый результат для ниже xml должен быть:
b, y, p
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<a>
<b>
<set>erase</set>
<d>
<set>erase</set>
</d>
</b>
<c>
<x>
</x>
</c>
<e>
<y>
<set>erase</set>
<q>
</q>
</y>
<z>
<p>
<set>erase</set>
</p>
</z>
</e>
</a>
Когда я использую query = (//set[contains(.,'erase')])[1]
Я получаю только узел b
в наборе результатов.Когда я использую query = //set[contains(.,'erase')]
, я получаю в списке результатов все nodeList b,d,y,p
.
Может ли кто-нибудь помочь мне найти запрос, приводящий к nodeList b
, y
и p
.
Вот фрагмент кода Java, который я использовал.
XPath xpath = factory.newXPath();
String query = "//set[contains(.,'erase')]";
XPathExpression expr=null;
try {
expr = xpath.compile(query);
} catch (XPathExpressionException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Object result = null;
try {
result = expr.evaluate(doc, XPathConstants.NODESET);
} catch (XPathExpressionException e) {
e.printStackTrace();
}
NodeList nodes = (NodeList) result;
for (int i = 0; i < nodes.getLength(); i++) {
String x = "";
Node n = nodes.item(i).getParentNode();
x=n.getNodeName();
while(!n.getNodeName().equalsIgnoreCase(request.getClass().getSimpleName())){
if ((n = n.getParentNode())!=null){
x=n.getNodeName()+"."+x;
}
}
System.out.println("Path: "+x);
вывод:
a.b
a.b.d
a.e.y
a.e.z.p
Может кто-нибудь помочь мне разобраться в запросе, который приводит только к a.b , a.e.y and a.e.z.p
Дайте мне знать, если вам нужно больше деталей.или любой другой вариант использования.