2

我从网站 ( 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>

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

现在,我使用 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...

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

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

(我无法更改此 XML 文件)

感谢帮助 :)

4

2 回答 2

2

您需要让查询知道 xml 命名空间。这里的答案看起来可以解决问题:

默认 Xml 命名空间 JDOM 和 XPATH

您还可以更改查询以使用 local-name 来忽略命名空间:

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

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

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

HTH,扎克

于 2010-08-16T13:11:07.253 回答
1

我最近没有这样做。但是快速搜索发现

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

这指向 XPathFactory 的使用:

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

或者,您可以使用 Zach 的答案而忽略给定的命名空间(如果我理解他的话)。如果同一层次结构级别上有更多“根”节点,这可能会导致问题。

于 2010-08-16T13:15:01.253 回答