【问题标题】:Get XML nodes from certain tree level从某个树级别获取 XML 节点
【发布时间】:2011-03-03 17:43:17
【问题描述】:

我需要一个像 Document.getElementsByTagName() 这样的方法,但它只搜索某个级别的标签(即,不是同名的嵌套标签)

示例文件:

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

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

【问题讨论】:

  • 像 XPath 这样的东西会有帮助吗?
  • @Victor 您能否给出一个 Java 中的 XPath 使用示例 - 作为答案;)
  • @Matt: 请注意 "not nested tags with the same name" 是完全不同的要求
  • 好问题,+1。请参阅我对通用 XPath 表达式的回答,该表达式在 XML 文档中选择具有给定名称并处于给定嵌套级别的所有元素。

标签: java xml xpath


【解决方案1】:

这是一个使用 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();
        }
    }
}

<script>
  <something>
    <findme>1</findme><!-- DO NOT FIND THIS TAG -->
  </something>
  <findme>Find this</findme><!-- FIND THIS TAG -->
  <findme>More of this</findme><!-- FIND THIS TAG AS WELL -->
</script>

它产生

Find this
More of this

【讨论】:

  • 我已经为多个标签修改了它。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    用途:

    /*/findme
    

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

    这个表达式

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

    选择 XML 文档中恰好具有五个祖先元素的所有 findme 元素 - 即,它们都处于“级别 6”。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-06
      • 2021-04-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多