当前位置:  开发笔记 > 编程语言 > 正文

默认XML命名空间,JDOM和XPath

如何解决《默认XML命名空间,JDOM和XPath》经验,为你挑选了2个好方法。

我想使用JDOM读取XML文件,然后使用XPath从JDOM文档中提取数据.它创建了Document对象,但是当我使用XPath查询Document的元素列表时,我什么也得不到.

我的XML文档在根元素中定义了一个默认命名空间.有趣的是,当我删除默认命名空间时,它成功运行XPath查询并返回我想要的元素.还有什么办法让我的XPath查询返回结果?

XML:




  Lord of the Rings: The Fellowship of the Ring
  178
  Ian Holm
  Elijah Wood
  Ian McKellen


  The Matrix
  136
  Keanu Reeves
  Laurence Fishburne


Java的:

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));
}

AnthonyWJone.. 26

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));
}


Michael Ruth.. 7

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

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

删除所有命名空间后,我可以使用简单的getChild("elname")样式导航或简单的XPath查询.

我不推荐这种技术作为一般解决方案,但在我的情况下它绝对有用.



1> AnthonyWJone..:

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> Michael Ruth..:

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

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

删除所有命名空间后,我可以使用简单的getChild("elname")样式导航或简单的XPath查询.

我不推荐这种技术作为一般解决方案,但在我的情况下它绝对有用.

推荐阅读
360691894_8a5c48
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有