如何通过XPath获取最新日期?

-1 投票
1 回答
527 浏览
提问于 2025-04-28 04:24

我有下面这个xml:

<Content>
<article title="I Compute, Therefore I am" id="a1">
        <authors>
            <author>Philbert von Cookie</author>
            <author>Alice Brockman</author>
            <author>Pedro Smith</author>
        </authors>
        <journal>
            <name>Journal of Computational Metaphysics</name>
            <volume>3</volume>
            <issue>7</issue>
            <published>04/11/2006</published>
            <pages start="42" end="49"/>
        </journal>
</article>
...
</Content>

在根元素content里面有很多类似的文章节点。

我已经把这个xml解析成了python代码,现在想要获取最大的日期值。以下是我的python代码:

try:
    import xml.etree.cElementTree as ET
except ImportError:
    import xml.etree.ElementTree as ET

tree = ET.ElementTree(file='data.xml')
root = tree.getroot()
root.tag, root.attrib

我试着用iterfind()来获取,但到现在为止都没有成功。

for elem in tree.iterfind('(/*/*/journal/published/value[not(text() < preceding-sibling::value/text()) and not(text() < following-sibling::value/text())])[1]'):
 print (elem.text)

你能帮我一下吗?我该怎么设置iterfind()的XPATH,或者有没有其他方法可以做到这一点?谢谢你。

暂无标签

1 个回答

1

xml.etree.ElementTree 这个库只提供了有限的xpath支持

一个替代的方法是把所有的日期解析到一个列表中,然后找出最大的那个日期:

from datetime import datetime

dates = [published.text for published in root.iterfind('.//article/journal/published')]
print max(dates, key=lambda x: datetime.strptime(x, '%d/%m/%Y'))

需要注意的是,在这种情况下,要找出最大值,你应该比较datetime类型的值,而不是字符串(这就是key函数派上用场的地方)。


另外,如果你想找到与最大日期对应的journal记录,你可以构建一个字典,把“日期 -> journal”进行映射,然后就能找到相应的journal记录:

from datetime import datetime
import operator

try:
    import xml.etree.cElementTree as ET
except ImportError:
    import xml.etree.ElementTree as ET

tree = ET.ElementTree(file='data.xml')
root = tree.getroot()

mapping = {datetime.strptime(journal.findtext('published'), '%d/%m/%Y'): journal 
           for journal in root.iterfind('.//article/journal')}

journal_latest = max(mapping.iteritems(), key=operator.itemgetter(0))[1]
print journal_latest.findtext('name')

撰写回答