我想在XML文件中搜索文本值并返回每个搜索结果的位置。
假设我有这个xml文件:
<tag>
<tag>
<tag>333</tag>
</tag>
<tag>
<tag>
<tag>333</tag>
</tag>
</tag>
</tag>
我会搜索价值&#34; 333&#34;:
String expression = "//tag[text()=333]/ancestor::*";
NodeList email = (NodeList) xPath.compile(expression).evaluate(xmlDocument, XPathConstants.NODESET);
String resultString = "";
for(int i=0; i< email.getLength();i++){
Element labTest = (Element) email.item(i);
resultString += labTest.toString().replace("[tag: null]","tag[0]") + " ";
}
我想要它返回的是2个节点,每个节点包含元素的位置。搜索333输出将是:
tag[0] tag[0]
tag[0] tag[0] tag[0]
搜索返回时:
tag[0] tag[0] tag[0] tag[0]
我怎样才能做到这一点?我应该以不同的方式解决问题吗?
答案 0 :(得分:2)
XPath节点集是一个没有重复项的集合,因此您的代码不是您想要的。因此
"//tag[text()=333]/
ancestor::*
并从此结果集创建输出字符串。答案 1 :(得分:1)
祖先不会被选中两次。因此,根<tag>
只会被选中一次。
每次迭代选择一个祖先标签;不会自动添加行分隔符。
要获得洞察力,请为标记添加级别属性(<tag l='0'>
,为每个级别添加一个更深层次),然后输出级别。假设您从0开始为根,并输出级别,您将看到输出为0112
。
对于体育运动,我制作了以下代码片段。第一个输出将显示所选级别的输出顺序。第二个将在您的问题中输出您需要的内容。
import java.io.StringReader;
import javax.xml.xpath.*;
import org.w3c.dom.*;
import org.xml.sax.InputSource;
public class XPathTags {
private static String xml1=
"<tag l='0'>"+
" <tag l='1'>"+
" <tag l='2'>333</tag>"+
" </tag>"+
" <tag l='1'>"+
" <tag l='2'>"+
" <tag l='3'>333</tag>"+
" </tag>"+
" </tag>"+
"</tag>";
private static String xml2=
"<tag>"+
" <tag>"+
" <tag>333</tag>"+
" </tag>"+
" <tag>"+
" <tag>"+
" <tag>333</tag>"+
" </tag>"+
" </tag>"+
"</tag>";
private static String xpathExpr1=
"//tag[text()=333]/ancestor::*/@l";
private static String xpathExpr2=
"//tag[text()=333]";
public static void main(String[] args) {
try {
XPath xpath = XPathFactory.newInstance().newXPath();
XPathExpression expr = xpath.compile(xpathExpr1);
NodeList nodeList = (NodeList) expr.evaluate(new InputSource(new StringReader(xml1)),XPathConstants.NODESET);
String resultString = "";
for( int i = 0; i != nodeList.getLength(); ++i ) {
resultString += nodeList.item(i).getNodeValue();
}
System.out.println(resultString);
resultString = "";
expr = xpath.compile(xpathExpr2);
XPathExpression anc = xpath.compile("ancestor::*");
nodeList = (NodeList) expr.evaluate(new InputSource(new StringReader(xml2)),XPathConstants.NODESET);
for( int i = 0; i != nodeList.getLength(); ++i ) {
Node n = (Node) nodeList.item( i );
NodeList ancestors = (NodeList) anc.evaluate(n,XPathConstants.NODESET);
for( int j = 0; j != ancestors.getLength(); ++j )
resultString += ancestors.item(j).toString().replace("[tag: null]", "tag[0]");
resultString += System.lineSeparator();
}
System.out.println(resultString);
} catch (XPathExpressionException e) {
e.printStackTrace();
}
}
}
输出:
0112
tag[0]tag[0]
tag[0]tag[0]tag[0]