【发布时间】:2012-02-14 02:43:40
【问题描述】:
我正在尝试查找所有遵循以下两条规则的元素名称。
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')] 时,我会在结果集中得到所有节点列表 b,d,y,p。
谁能帮我找到产生 nodeList b、y 和 p 的查询。
这是我使用的java代码sn-p。
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的查询
如果您需要更多详细信息,请告诉我。或任何其他用例。
【问题讨论】:
-
user1207560:您接受了错误的答案——只需在代码中使用建议的表达式来验证它没有选择想要的元素。我的回答中解释了为什么会这样。
标签: xml xslt xpath xml-parsing