JDOM2 xpath 在不同命名空间中查找节点
JDOM2 xpath finding nodes within a different namespace
我正在尝试使用 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=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" 属性。还有一个问题是文档中存在三个不同的命名空间("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 中显式声明的命名空间,它不会尝试打开命名空间 URL 因为 命名空间不一定是URL。例如,我在 中找到的以下 URI 也适用于命名空间:uuid:ebfd9-45-48-a9eb-42d
我正在尝试使用 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=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" 属性。还有一个问题是文档中存在三个不同的命名空间("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 中显式声明的命名空间,它不会尝试打开命名空间 URL 因为 命名空间不一定是URL。例如,我在 uuid:ebfd9-45-48-a9eb-42d