【问题标题】:if XML file has "xmlns",how can I get Text from XML file using XPath如果 XML 文件有“xmlns”,我如何使用 XPath 从 XML 文件中获取文本
【发布时间】:2010-08-16 13:00:13
【问题描述】:

我从网站 (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/",它可以工作了!

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

(我无法更改此 XML 文件)

感谢您的帮助:)

【问题讨论】:

    标签: java xml jdom


    【解决方案1】:

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

    Default Xml Namespace JDOM and XPATH

    您也可以更改查询以使用本地名称来忽略命名空间:

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

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

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

    HTH, 扎克

    【讨论】:

      【解决方案2】:

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

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

      其中指向 XPathFactory 的用法:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多