如何在Java 7中通过XPath获取JDOM 2的所有元素名称?

时间:2013-06-14 13:07:58

标签: xpath-2.0 jdom-2

我有一个类似以下的XML文件。

<?xml version="1.0" encoding="UTF-8"?>
<Site>
  <Name>MySite</Name>
  <Groups>
      <Default></Default>
      <GroupA></GroupA>
  </Groups>
</Site>

我希望将Groups的子元素的所有名称(在此示例中为“Default”和“GroupA”)作为字符串列表。我正在尝试以下方法。

public List<String> getGroupNames() {
    List<String> names = new ArrayList<String>();

    XPathExpression<Text> xpath = XPathFactory.instance().compile(
            "/Site/Groups/*/name()", Filters.text());

    List<Text> elements = xpath.evaluate(document);

    if (elements.size() > 0) {
        for (Text text : elements) {
            names.add(text.getText());
        }
        return names;
    }
    return null;
}

如果出现以下异常,则会失败。

class org.jaxen.saxpath.XPathSyntaxException: /Site/Groups/*/name(): 20: Expected node-type

适当的语法是什么?我不明白这个例外。

1 个答案:

答案 0 :(得分:0)

您使用的XPathFactory实例似乎只支持XPath 1。

在使用xpath 2之前,您需要加载一个支持XPath 2的库。例如:使用SAXON:

import net.sf.saxon.om.NamespaceConstant;  


String objectModel = NamespaceConstant.OBJECT_MODEL_SAXON;  
System.setProperty("javax.xml.xpath.XPathFactory:"+objectModel, "net.sf.saxon.xpath.XPathFactoryImpl");