3

次のようなOAI-PMHXMLファイルを解析する必要があります。<record>ListRecordのすべてのノードを繰り返し処理したいと思います。

<?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

なぜXMLListRecordsを取得できなかったのかわかりません。record私は何か見落としてますか?

4

2 に答える 2

3

これはXPath Expression returns Nothing for //element, but //* returns 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
于 2011-08-15T03:55:15.673 に答える
2

私はそれがxmlns問題であることを賭けます.ドメインパラメータを使ってみましたか? 試す:

 document.getRootElement
         .getChildElements("ListRecords", 
                           "http://www.openarchives.org/OAI/2.0/").size

基本的に、多くの言語では、XML オブジェクトにデフォルトの ns が指定されている場合、出力された DOM 自体にプレフィックスが付けられていなくても、そのノードをルックアップするために名前空間が必要になります。

(Brian Hsu が示すように、これは XPathContext オブジェクトを使用して行うこともできます)

于 2011-08-15T03:55:16.313 に答える