Java中的Xpath - 返回搜索结果标记位置

时间:2016-02-29 09:12:15

标签: java xml xpath

我想在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]

我怎样才能做到这一点?我应该以不同的方式解决问题吗?

2 个答案:

答案 0 :(得分:2)

XPath节点集是一个没有重复项的集合,因此您的代码不是您想要的。因此

  1. 选择"//tag[text()=333]/
  2. 为每个节点选择ancestor::*并从此结果集创建输出字符串。

答案 1 :(得分:1)

  1. 祖先不会被选中两次。因此,根<tag>只会被选中一次。

  2. 每次迭代选择一个祖先标签;不会自动添加行分隔符。

  3. 要获得洞察力,请为标记添加级别属性(<tag l='0'>,为每个级别添加一个更深层次),然后输出级别。假设您从0开始为根,并输出级别,您将看到输出为0112

  4. 对于体育运动,我制作了以下代码片段。第一个输出将显示所选级别的输出顺序。第二个将在您的问题中输出您需要的内容。

    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]