【问题标题】:Both XPath/getChildElements failed to get XML child in XOMXPath/getChildElements 都未能在 XOM 中获取 XML 子项
【发布时间】:2011-08-15 03:44:33
【问题描述】:

我必须解析一个 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 获取这些节点时,无论我使用什么方法(查询或 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 中获得 ListRecordsrecord。我错过了什么?

【问题讨论】:

    标签: java xml scala xom


    【解决方案1】:

    我发现这是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
    

    【讨论】:

      【解决方案2】:

      我敢打赌这是xmlns 问题——您是否尝试过使用域参数?试试:

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

      基本上,许多语言,当在 XML 对象上给定默认 ns 时,将需要该命名空间来查找该节点——即使它在输出的 DOM 本身中没有前缀。

      (这也可以使用 XPathContext 对象来完成,如 Brian Hsu 所示)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-02-02
        • 2013-06-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多