Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从特定树级别获取XML节点_Java_Xml_Xpath - Fatal编程技术网

Java 从特定树级别获取XML节点

Java 从特定树级别获取XML节点,java,xml,xpath,Java,Xml,Xpath,我需要一个类似Document.getElementsByTagName()的方法,但该方法只搜索某个级别的标记(即,不搜索同名的嵌套标记) 示例文件: <script> <something> <findme></findme><!-- DO NOT FIND THIS TAG --> </something> <findme></findme><!-- FIND THIS

我需要一个类似Document.getElementsByTagName()的方法,但该方法只搜索某个级别的标记(即,不搜索同名的嵌套标记)

示例文件:

<script>
  <something>
    <findme></findme><!-- DO NOT FIND THIS TAG -->
  </something>
  <findme></findme><!-- FIND THIS TAG -->
</script>


Document.getElementsByTagName()只返回文档中的所有findme标记。

如果使用DOM,我能想到的唯一方法就是使用一个递归函数来查看每个元素的子元素。

下面是一个XPath示例

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpression;
import javax.xml.xpath.XPathFactory;

import org.w3c.dom.Document;
import org.w3c.dom.NodeList;

public class TestXPath {

    private static final String FILE = "a.xml" ;
    private static final String XPATH = "/script/findme";
    public static void main(String[] args) {

        DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
        docFactory.setNamespaceAware(true);
        DocumentBuilder builder;
        try {
            builder = docFactory.newDocumentBuilder();
            Document doc = builder.parse(FILE);
            XPathExpression expr = XPathFactory.newInstance().newXPath().compile(XPATH);
            Object hits = expr.evaluate(doc, XPathConstants.NODESET ) ;
            if ( hits instanceof NodeList ) {
                NodeList list = (NodeList) hits ;
                for (int i = 0; i < list.getLength(); i++ ) {
                    System.out.println( list.item(i).getTextContent() );
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
使用:

/*/findme
此XPath表达式选择作为XML文档顶部元素的子元素的所有
findme
元素

此表达式

//findme[count(ancestor::*) = 5]

选择XML文档中正好有五个祖先元素的所有
findme
元素——也就是说,它们都处于“级别6”。

类似XPath的内容会有帮助吗?另请参见@Victor您能给出Java中的XPath用法示例吗?作为答案;)@马特:请注意“不是同名的嵌套标签”是一个完全不同的要求好问题,+1。关于选择XML文档中具有给定名称和给定嵌套级别的所有元素的通用XPath表达式,请参见我的答案。
/*/findme
//findme[count(ancestor::*) = 5]