尚未声明前缀为“uml”的JDOM2命名空间

时间:2014-02-20 17:06:26

标签: java xpath xml-namespaces jdom-2

我试图通过JDOM的XPathExpression选项获取一个元素。

我的代码如下所示:

public static Element getElement(Document doc)
{
    XPathFactory xpfac = XPathFactory.instance();
    XPathExpression<Element> xp = xpfac.compile("//uml:Model/packagedElement[@name='Content']", Filters.element());
    return xp.evaluateFirst(doc);
}

可悲的是,我收到以下错误:

java.lang.IllegalArgumentException:尚未声明前缀为“uml”的命名空间。

我的文档开头是这样的:

<?xml version='1.0' encoding='UTF-8'?>
<xmi:XMI xmi:version='2.1' xmlns:uml='http://www.omg.org/spec/UML/20090901'...

所以在我看来,声明了名称空间。如果我使用给定文档的工具检查xpath表达式,则找到该元素。

这就是我创建文档的方式:

public static Document readXML(File file)
{
    Document doc = null;
    try {
        doc = new SAXBuilder().build(file);
    } catch (JDOMException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
    return doc;
}

那么,错误呢? XpathExpression如何找到元素“// uml:Model / packagedElement [@ name ='Content']”?

祝你好运

1 个答案:

答案 0 :(得分:2)

命名空间在XML中声明,但您还必须register it for the XPath query

XPathExpression<Element> xp =
    xpfac.compile("//uml:Model/packagedElement[@name='Content']",
        Filters.element(),
        null,
        Namespace.getNamespace("uml", "http://www.omg.org/spec/UML/20090901"));