如果XML文件具有“xmlns”,我如何使用XPath从XML文件中获取Text

时间:2010-08-16 13:00:14

标签: java xml jdom

我从网站(http://www.abc.com/)获取XML文件,

网址为:http://www.abc.com/api/api.xml

内容是:

<?xml version="1.0" encoding="utf-8"?>
<root xmlns="http://www.abc.com/">
    <name>Hello!</name>
</root>

它在XML文件中有xmlns="http://www.abc.com/"

现在,我使用JDOM XPath来获取文本Hello!

XPath xpath = XPath.newInstance("/root/name/text()");
SAXBuilder builder = new SAXBuilder();
Document doc = builder.build(new URL("http://www.abc.com/api/api.xml"));

System.out.println(xpath.valueOf(doc)); //nothing to print...

我测试从XML文件中删除xmlns="http://www.abc.com/",它是可行的!

如果存在Hello!,如何更改我的java代码以获取xmlns="http://www.abc.com/"

(我无法查看此XML文件)

感谢您的帮助:)

2 个答案:

答案 0 :(得分:2)

您需要使查询知道xml命名空间。这里的答案看起来就像诀窍一样:

Default Xml Namespace JDOM and XPATH

您也可以更改查询以使用local-name忽略名称空间:

XPath xpath = XPath.newInstance("/*[local-name() = 'root']");

那应该返回名为root的节点。也就是说,如果它支持它,我输入正确! :)我不熟悉用于XML + XPATH的java API。

请注意,xml名称空间的存在是为了将节点“root”与名为“root”的任何其他节点区分开来。就像类/包命名空间一样。忽略它们可能会导致名称冲突。你的milage可能会有所不同。

HTH, 扎克

答案 1 :(得分:1)

我最近没有这样做过。但是快速搜索了

http://illegalargumentexception.blogspot.com/2009/05/java-using-xpath-with-namespaces-and.html

指向使用XPathFactory:

NamespaceContext context = new NamespaceContextMap("http://www.abc.com/" );

或者,您可以使用Zach的答案,只是忽略给定的命名空间(如果我理解他的话)。如果在同一层次结构级别存在更多“根”节点,则可能会出现问题。