【问题标题】:dom4j-java- how to get all elements (parent or children) within root that have specific element namedom4j-java-如何获取根中具有特定元素名称的所有元素(父或子)
【发布时间】:2012-06-11 13:36:55
【问题描述】:

我想获取 xml 中具有特定名称的元素的数量,例如。名称="同时")

问题在于,如果我使用以下代码——我只能得到具有此名称的顶级元素——

       for ( Iterator i = root.elementIterator( "while" ); i.hasNext(); ) {
            Element foo = (Element) i.next();

但任何较低级别的“while”元素都不是迭代器的一部分...

获取所有具有 name="while" 的元素(无论是顶级还是低级)的最有效方法是什么?为此,我是否必须解析文档中的所有元素?

【问题讨论】:

标签: java xml dom4j


【解决方案1】:

您可以通过 //whilename() 函数和通配符节点 * 使用 XPath://*[name() = 'while']

List list = document.selectNodes("//*[name() = 'while']"); // or "//while"
int numberOfNodes = list.size();
for (Iterator iter = list.iterator(); iter.hasNext(); ) {
    // do something
}

【讨论】:

  • 如何首先验证文档中是否存在 name=while 的元素?
  • 您只需要在包含while 节点的列表上调用size()
  • 我尝试使用您的代码 - 这是我得到的错误 - 线程“main”中的异常 java.lang.NoClassDefFoundError: org.dom4j.DocumentFactory.createXPath(DocumentFactory 的 org/jaxen/JaxenException .java:230) 在 org.dom4j.tree.AbstractNode.createXPath(AbstractNode.java:207) 在 org.dom4j.tree.AbstractNode.selectNodes(AbstractNode.java:164) 在 Test.processwhile(Test.java:70) ---请澄清出了什么问题...我在这里遗漏了什么吗?谢谢...
  • 您缺少一些依赖项,或者您没有正确配置您的类路径。 org/jaxen/JaxenExceptiondom4j 捆绑在一起
【解决方案2】:

这个正则表达式对我有用:

document.selectNodes(".//*")

【讨论】:

  • 这不是正则表达式。这是一个 XPath 查询。
【解决方案3】:

元素迭代器仅适用于 xPath 中的下一级。为了能够解析所有 XML 并获取所有元素,您必须使用一些递归。例如,下一个代码将返回具有“名称”的所有节点的列表

public List<Element> getElementsByName(String name, Element parent, List<Element> elementList)
{
    if (elementList == null)
        elementList = new ArrayList<Element>();

    for ( Iterator i = parent.elementIterator(); i.hasNext(); ) {
        Element current = (Element) i.next();
        if (current.getName().equalsIgnoreCase(name))
        {
            elementList.add(current);
        }

        getElementsByName(name, current, elementList);
    }
    return elementList;
}

【讨论】:

    猜你喜欢
    • 2011-05-06
    • 2023-03-10
    • 2011-10-17
    • 1970-01-01
    • 2010-12-14
    • 2013-09-10
    • 2015-10-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多