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

Pri*_*hmp 5 java xpath jdom-2

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

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

我一直在成功地使用Xpath <record>从文档中提取标签.为此,我使用以下xpath查询:"// oai:record"其中"oai"命名空间是我为了使用xpath而组建的命名空间.

你可以在这里看到我正在解析的XML文档,我在下面放了一个示例:http://memory.loc.gov/cgi-bin/oai2_0?verb = ListRecords&set = cwp&metadataPrefix = oo_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>
Run Code Online (Sandbox Code Playgroud)

如果您查看较大的文档,您将看到任何标记上都没有列出"xmlns"属性.还有一个问题是文档中有三个不同的命名空间("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();
Run Code Online (Sandbox Code Playgroud)

任何想法将不胜感激!谢谢.

har*_*r07 2

在 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">
Run Code Online (Sandbox Code Playgroud)

XML 解析器只能看到 XML 中显式声明的命名空间,它不会尝试打开命名空间 URL,因为命名空间不一定是 URL。例如,我在最近的 SO 问题中发现的以下 URI对于命名空间也是可以接受的:uuid:ebfd9-45-48-a9eb-42d