java - JDOM2 xpath 在不同命名空间中查找节点

标签 java xpath jdom-2

我正在尝试使用 JDOM2 从 XML 文档中提取我关心的信息。如何获取标签内的标签?

我只取得了部分成功。虽然我已经能够使用 xpath 提取 <record>标签,用于提取记录标签中的标题、描述和其他数据的 xpath 查询一直返回 null。

我一直在使用 Xpath 成功提取 <record>标记出文档。为此,我使用以下 xpath 查询:“//oai:record”,其中“oai” namespace 是我为使用 xpath 而创建的 namespace 。

您可以在此处看到我正在解析的 XML 文档,我在下面放了一个示例:http://memory.loc.gov/cgi-bin/oai2_0?verb=ListRecords&set=cwp&metadataPrefix=oai_dc

<record>
    <header>
        <identifier>oai:lcoa1.loc.gov:loc.pnp/cph.3a02293</identifier>
        <datestamp>2009-05-27T07:22:37Z</datestamp>
        <setSpec>cwp</setSpec>
        <setSpec>lcphotos</setSpec>
    </header>
    <metadata>
        <oai_dc:dc xsi:schemaLocation="http://www.openarchives.org/OAI/2.0/oai_dc/                          http://www.openarchives.org/OAI/2.0/oai_dc.xsd">
            <dc:title>Jubal A. Early</dc:title>
            <dc:description>This record contains unverified, old data from caption card.</dc:description>
            <dc:date>[between 1860 and 1880]</dc:date>
            <dc:type>image</dc:type>
            <dc:type>still image</dc:type>
            <dc:identifier>http://hdl.loc.gov/loc.pnp/cph.3a02293</dc:identifier>
            <dc:language>eng</dc:language>
            <dc:rights>No known restrictions on publication.</dc:rights>
        </oai_dc:dc>
    </metadata>
</record>

如果查看较大的文档,您会发现在任何标签上都没有列出“xmlns”属性。还有一个问题是文档中存在三个不同的 namespace (“none/oai”、“oai_dc”、“dc”)。

发生的事情是 xpath 没有匹配任何内容,并且 evaluateFirst(parent) 返回 null。

这是我的一些代码,用于从记录元素中提取标题、日期、描述等。

    XPathFactory xpf = XPathFactory.instance();
    XPathExpression<Element> xpath = xpf.compile("//dc:title",
                  Filters.element(), null,
                  namespaceList.toArray(new Namespace[namespaceList.size()]));
    Element tag = xpath.evaluateFirst(parent);

    if(tag != null)
    {
        return Option.fromString(tag.getText());
    }

    return Option.none();

如有任何想法,我们将不胜感激!谢谢。

最佳答案

在您的 XML 中,dc 前缀映射到命名空间 uri http://purl.org/dc/elements/1.1/,因此请确保声明了命名空间相应地在 XPath 中使用的前缀映射。这是命名空间前缀在您的 XML 中声明的部分:

<oai_dc:dc
    xmlns:oai_dc="http://www.openarchives.org/OAI/2.0/oai_dc/"
    xmlns:dc="http://purl.org/dc/elements/1.1/"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.openarchives.org/OAI/2.0/oai_dc/
                         http://www.openarchives.org/OAI/2.0/oai_dc.xsd">

XML 解析器只看到在 XML 中显式声明的 namespace ,它不会尝试打开 namespace URL,因为 namespace 不一定是 URL。例如,我在 this recent SO question 中找到的以下 URI命名空间也可以接受:uuid:ebfd9-45-48-a9eb-42d

关于java - JDOM2 xpath 在不同命名空间中查找节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34258427/

相关文章:

java - 在 .txt 文件内的特定位置读取和写入文本

java - 当我从 Java 代码执行 C++ 程序时,我应该如何测量它的执行时间?

Java:如何获取 org.w3c.dom.Node 的 xpath?

java - 使用 jdom2 将响应字符串解析为 xml

java - "main"java.lang.NoClassDefFoundError : org/jdom/JDOMException

java - 如何调用类层次结构中的方法?

Java日期和时间从给定日期 "2019-12-03T10:00:00-06:00 "中删除时区,预期日期为 "2019-12-03T10:00:00"

xml - 如何从 XML 中提取子节点值作为字符串

php - simpleXML:解析 XML 以仅输出元素属性

java - 使用 JDOM 查找后代元素