3

我尝试使用 Jython 和 ElementTree 在 Google Refine 中解析一些 xml,但我正在努力寻找任何文档来帮助我完成这项工作(可能不是因为不是 python 编码器而没有帮助)

这是我要解析的 XML 的摘录。我正在尝试返回所有以下内容的连接字符串dc:indentifier

<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">
  <dc:creator>J. Koenig</dc:creator>
  <dc:date>2010-01-13T15:47:38Z</dc:date>
  <dc:date>2010-01-13T15:47:38Z</dc:date>
  <dc:date>2010-01-13T15:47:38Z</dc:date>
  <dc:identifier>CCTL0059</dc:identifier>
  <dc:identifier>CCTL0059</dc:identifier>
  <dc:identifier>http://open.jorum.ac.uk:80/xmlui/handle/123456789/335</dc:identifier>
  <dc:format>application/pdf</dc:format>
</oai_dc:dc>

这是我到目前为止的代码。这是一个返回任何东西的测试,因为现在我得到的只是'错误:null'

from elementtree import ElementTree as ET
element = ET.parse(value)

namespace = "{http://www.openarchives.org/OAI/2.0/oai_dc/}"
e = element.findall('{0}identifier'.format(namespace))
for i in e:
   count += 1
return count
4

3 回答 3

2

您可以使用这样的 GREL 表达式,尝试一下:

forEach(value.parseHtml().select("dc|identifier"),v,v.htmlText()).join(",")

对于找到的每个标识符,给我 htmlText 并用逗号将它们全部连接起来。parseHtml() 使用 Jsoup.org 库,实际上只是解析标签和结构。它还知道使用 ns|identifier 格式解析命名空间,并且是在这种情况下获得您想要的东西的好方法。

于 2011-12-15T20:29:07.727 回答
2

您使用了错误的命名空间。这适用于 Jython 2.5.1:

from xml.etree import ElementTree as ET
element = ET.fromstring(value) # `value` is a string with the xml from question

namespace = "{http://purl.org/dc/elements/1.1/}"
for e in element.getiterator(namespace+'identifier'):
    print e.text

输出

CCTL0059
CCTL0059
http://open.jorum.ac.uk:80/xmlui/handle/123456789/335
于 2011-12-15T00:53:38.580 回答
0

这是对 JF Sebastian 版本的微调,可以直接粘贴到 Google Refine 中:

from xml.etree import ElementTree as ET
element = ET.fromstring(value)
namespace = "{http://purl.org/dc/elements/1.1/}"
return ','.join([e.text for e in element.getiterator(namespace+'identifier')])

它返回一个逗号分隔的列表,但您可以更改 return 语句中使用的分隔符。

于 2011-12-15T17:35:06.317 回答