我从网站(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文件)
感谢您的帮助:)
答案 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的答案,只是忽略给定的命名空间(如果我理解他的话)。如果在同一层次结构级别存在更多“根”节点,则可能会出现问题。