我尝试使用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
答案 0 :(得分: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
答案 1 :(得分:2)
您可以使用这样的GREL表达式,试一试:
forEach(value.parseHtml().select("dc|identifier"),v,v.htmlText()).join(",")
对于找到的每个标识符,给我htmlText并用逗号连接它们。 parseHtml()使用Jsoup.org库,实际上只是解析标签和结构。它还知道如何使用ns | identifier格式解析名称空间,并且在这种情况下获取后续内容是一种很好的方式。
答案 2 :(得分:0)
这是对J.F. 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语句中使用的分隔符。