代码之家  ›  专栏  ›  技术社区  ›  Michael

默认XML命名空间、JDOM和XPath

  •  13
  • Michael  · 技术社区  · 17 年前

    我的XML文档在根元素中定义了一个默认命名空间。有趣的是,当我删除默认名称空间时,它成功地运行了XPath查询并返回了我想要的元素。我还必须做什么才能使XPath查询返回结果?

    XML:

    <?xml version="1.0" encoding="UTF-8"?>
    <collection xmlns="http://www.foo.com">
    <dvd id="A">
      <title>Lord of the Rings: The Fellowship of the Ring</title>
      <length>178</length>
      <actor>Ian Holm</actor>
      <actor>Elijah Wood</actor>
      <actor>Ian McKellen</actor>
    </dvd>
    <dvd id="B">
      <title>The Matrix</title>
      <length>136</length>
      <actor>Keanu Reeves</actor>
      <actor>Laurence Fishburne</actor>
    </dvd>
    </collection>
    

    public static void main(String args[]) throws Exception {
        SAXBuilder builder = new SAXBuilder();
        Document d = builder.build("xpath.xml");
        XPath xpath = XPath.newInstance("collection/dvd");
        xpath.addNamespace(d.getRootElement().getNamespace());
        System.out.println(xpath.selectNodes(d));
    }
    
    3 回复  |  直到 17 年前
        1
  •  26
  •   Verhagen    11 年前

    XPath 1.0 XPath 2.0 任何未加前缀的标签总是被假定为无名称命名空间的一部分。

    XPath 1.0

    public static void main(String args[]) throws Exception {
        SAXBuilder builder = new SAXBuilder();
        Document d = builder.build("xpath.xml");
        XPath xpath = XPath.newInstance("x:collection/x:dvd");
        xpath.addNamespace("x", d.getRootElement().getNamespaceURI());
        System.out.println(xpath.selectNodes(d));
    }
    
        2
  •  7
  •   Peter Mortensen Pieter Jan Bonestroo    15 年前

    我也遇到了类似的问题,但我的问题是,我有混合的XML输入,其中一些定义了命名空间,另一些没有。为了简化我的问题,我在加载文档后运行了以下JDOM代码段。

    for (Element el : doc.getRootElement().getDescendants(new ElementFilter())) {
        if (el.getNamespace() != null) el.setNamespace(null);
    }
    

    样式导航或简单的XPath查询。

        3
  •  1
  •   Jerome Anthony    11 年前

    /*[local-name() = 'collection']/*[local-name() = 'dvd']/

    Here 是有用的xpath查询列表。