求同级及以上的XML个节点数

Find the number of XML nodes at same level or above

我想找出与@title="d"的节点处于同一级别或更高级别的节点数

XML:

<item title="a">
       <item title="b">               
           <item title="c"></item>
           <item title="d">  
               <item title="e"></item>  
               <item title="f"></item>
           </item>                 
       </item> 
       <item title="x">             
           <item title="y"></item> 
           <item title="z"></item>  
       </item>            
</item> 
L0。 . . . . .一个 。 . . .
              / \
L1。 . . . .湾。 . X 。 .
           / \ / \
L2。 . . 。C 。 d.y. z 。
             / \
L3。 . . . .e. F 。 . . .

一些例子:

System.out.println(leftDomainSize("d")); // 7
System.out.println(leftDomainSize("x")); // 3
System.out.println(leftDomainSize("e")); // 9

代码:

public int leftDomainSize(String s){
        DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
        DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
        Document document = documentBuilder.parse(path);
        //????
}

您可以使用广度优先搜索,如下所示:

public int leftDomainSize(String s) throws Exception{
    class Pair {
        Element elem;
        int depth;

        public Pair(Element elem, int depth) {
            this.elem = elem;
            this.depth = depth;
        }
    }

    DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
    DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();

    Document document = documentBuilder.parse(path);
    Element root = document.getDocumentElement();

    // Breadth First Search
    LinkedList<Pair> queue = new LinkedList<Pair>();
    int depth = Integer.MAX_VALUE;
    queue.add(new Pair(root, 1));
    int result = 0;
    while(!queue.isEmpty()) {
        Pair curr = queue.remove();
        if(curr.depth > depth) {
            continue;
        }
        result++;
        if (curr.elem.getAttribute("title").equals(s)) {
            depth = curr.depth;
        }
        NodeList children = curr.elem.getChildNodes();
        for(int i = 0; i<children.getLength(); i++) {
            Node child = children.item(i);
            if(child instanceof Element) {
                queue.add(new Pair((Element)child, curr.depth + 1));
            }
        }
    }
    return result;
}

试试这个功能,它应该通过反向查看父节点及其子节点来工作,

public int findNodes(Node node)
{
  int count = 0;
  Node parent = null;
  do
  {
    parent = node.getParentNode();
    if(parent==null)break;
    NodeList list = parent.getChildNodes();
    count += list.getLength();
    node = parent;
  }
  while(parent != null);
  return count;
}

纯 XPath 解决方案:

您可以计算其祖先计数小于或等于给定项目的祖先计数的项目数。因此,对于标题等于 'd' 的项目:

count(//item[count(//item[@title='d']/ancestor::item) >= count(ancestor::item)])

7

也适用于您的其他示例:

count(//item[count(//item[@title='x']/ancestor::item) >= count(ancestor::item)])

3

和:

count(//item[count(//item[@title='e']/ancestor::item) >= count(ancestor::item)])

9