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

Java JDOM2 xpath在不同命名空间中查找节点,java,xpath,jdom-2,Java,Xpath,Jdom 2,我试图使用JDOM2从XML文档中提取我关心的信息。如何在标签中获取标签 我只取得了部分成功。虽然我已经能够使用xpath提取标记,但用于提取标题、描述和记录标记中的其他数据的xpath查询一直返回null 我已经成功地使用Xpath从文档中提取了标记。为此,我使用以下xpath查询:“//oai:record”,其中“oai”名称空间是我为了使用xpath而创建的名称空间 您可以在这里看到我正在解析的XML文档,我在下面放了一个示例: oai:lcoa1.loc.gov:loc.pnp/cp

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

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

我已经成功地使用Xpath从文档中提取了
标记。为此,我使用以下xpath查询:“//oai:record”,其中“oai”名称空间是我为了使用xpath而创建的名称空间

您可以在这里看到我正在解析的XML文档,我在下面放了一个示例:


oai:lcoa1.loc.gov:loc.pnp/cph.3a02293
2009-05-27T07:22:37Z
cwp
液晶照片
朱巴尔A.厄尔
此记录包含标题卡中未经验证的旧数据。
[1860至1880年间]
形象
静止图像
http://hdl.loc.gov/loc.pnp/cph.3a02293
英格
对出版没有已知的限制。
如果查看较大的文档,您将看到任何标记上都没有列出“xmlns”属性。还有一个问题是,文件中有三个不同的名称空间(“无/oai”、“oai_dc”、“dc”)

发生的情况是xpath没有匹配任何内容,而evaluateFirst(父级)返回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();
XPathFactory xpf=XPathFactory.instance();
XPathExpression xpath=xpf.compile(“//dc:title”,
Filters.element(),null,
toArray(新名称空间[namespaceList.size()]);
元素标记=xpath.evaluateFirst(父级);
如果(标记!=null)
{
return Option.fromString(tag.getText());
}
返回选项。无();

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

在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中显式声明的名称空间,它不会尝试打开名称空间URL,因为名称空间不一定是URL。例如,我在中找到的以下URI对于命名空间也是可以接受的:
uuid:ebfd9-45-48-a9eb-42d

这里有什么问题吗?我不明白你在问什么?我知道我从
记录中提取了
dc:title
的内容?我不知道jdom-tho,但假设你已经将
dc
映射到了正确的名称空间uri
http://purl.org/dc/elements/1.1/
,我认为XPath应该work@har07你是对的。发生的事情是,我已将dc命名空间映射到。(这就是重定向到的地方。我觉得有点傻。)一旦我更改了它,它就开始工作了。这提出的问题比它回答的问题多。XML解析器如何知道哪个名称空间是正确的?我认为我没有发出HTTP请求,而且purl.org从未出现在原始XML中。无论如何,如果你添加你的评论作为答案,我会把它标记为正确的。@Gamebear已经发布了答案。它还简要回答了您在上面最后一次评论中提出的问题
<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">