我要解析一个OAI-PMH XML文件,如下所示。我想迭代ListRecord中的所有<record>
个节点。
<?xml version="1.0" encoding="UTF-8"?>
<OAI-PMH xsi:schemaLocation="http://www.openarchives.org/OAI/2.0/ http://www.openarchives.org/OAI/2.0/OAI-PMH.xsd" xmlns="http://www.openarchives.org/OAI/2.0/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<responseDate>2010-12-30T10:46:39.654+08:00</responseDate>
<request verb="ListRecords" metadataPrefix="oai_dc">http://172.16.1.118/ahd/oai2.do</request>
<ListRecords>
<record>
<header>
<identifier>9010402101001001</identifier>
</header>
<metadata>
<oai_dc:dc xsi:schemaLocationfiltered="http://www.openarchives.org/OAI/2.0/oai_dc/ http://www.openarchives.org/OAI/2.0/oai_dc.xsd" xmlns:oai_dc="http://www.openarchives.org/OAI/2.0/oai_dc/" xmlns:dc="http://purl.org/dc/elements/1.1/">
<dc:identifier>9010402101001001</dc:identifier>
</oai_dc:dc>
</metadata>
</record>
<resumptionToken>1509/1509</resumptionToken>
</ListRecords>
</OAI-PMH>
但是当我使用XOM 1.2.5获取那些节点时,无论我使用什么方法(query或getChildElements),它总是返回0个节点。
以下是我在Scala解释器中使用的代码:
scala> import nu.xom.Builder
import nu.xom.Builder
scala> val builder = new Builder
builder: nu.xom.Builder = nu.xom.Builder@6682d439
scala> val document = builder.build(new java.io.File("/home/brianhsu/qqq.xml"))
document: nu.xom.Document = [nu.xom.Document: OAI-PMH]
scala> document.query("//record").size
res0: Int = 0
scala> document.query("//ListRecords").size
res1: Int = 0
scala> document.getRootElement.getChildElements("ListRecords").size
res2: Int = 0
我不知道为什么我无法在XML中获得ListRecords
和record
。我错过了什么?
答案 0 :(得分:3)
我发现这是XPath Expression returns nothing for //element, but //* returns a count
的副本以下代码有效,我需要将标记名称绑定到命名空间。
scala> val context = new XPathContext("xsi", "http://www.openarchives.org/OAI/2.0/")
context: nu.xom.XPathContext = nu.xom.XPathContext@19a3f495
scala> document.query("//xsi:record", context).size
res6: Int = 1
答案 1 :(得分:2)
我打赌这是xmlns
问题 - 您是否尝试过使用域参数?尝试:
document.getRootElement
.getChildElements("ListRecords",
"http://www.openarchives.org/OAI/2.0/").size
基本上,许多语言,当在XML对象上给出默认ns时,将要求该命名空间查找该节点 - 即使它没有在输出的DOM本身中作为前缀。
(这也可以使用XPathContext对象完成,如Brian Hsu所示)