如何使用ElementTree检索特定的标记信息?

2024-06-26 13:35:58 发布

您现在位置:Python中文网/ 问答频道 /正文

我想检索特定的标记属性。 file标记包含子标记filename,基于此字段,我想决定是否应使用modification

换句话说:如果filename值包含.tar,我想打印修改时间

在下面的例子中,我希望2020-07-15T06:41:12.000Z会被打印出来

我尝试了两个小时,但没有成功,所以我真的很感谢任何能让我更接近解决方案的提示。 下面是代码,但没有任何内容被打印或添加到dates列表中:

import xml.etree.ElementTree as ET

tree = ET.parse(r"C:\path\to\file\logs.xml")
root = tree.getroot()
dates = []
for filetag in root.findall('.//{*}file'):
    for filename in filetag.findall('../{*}filename'):
        if ".tar" in filename.attrib['value']:
            print(filename)
            dates.append(filename)

以下是XML文档:

<?xml version="1.0" encoding="UTF-8"?>
<session xmlns="http://winscp.net/schema/session/1.0" name="user@11.11.111.11" start="2020-07-22T10:01:12.939Z">
  <ls>
    <destination value="/folder/processing" />
    <files>
      <file>
        <filename value="." />
        <type value="d" />
        <modification value="2020-07-22T08:57:28.000Z" />
        <permissions value="rwxrwsrwx" />
        <owner value="1000130000" />
        <group value="0" />
      </file>
      <file>
        <filename value=".." />
        <type value="d" />
        <modification value="2020-07-22T08:51:15.000Z" />
        <permissions value="rwxrwxrwx" />
        <owner value="1000130000" />
        <group value="0" />
      </file>
      <file>
        <filename value="package_tsp200715092001_20200715074120.tar" />
        <type value="-" />
        <size value="4014536192" />
        <modification value="2020-07-15T06:41:12.000Z" />
        <permissions value="rw-rw-rw-" />
        <owner value="1005" />
        <group value="1005" />
      </file>
      <file>
        <filename value="package_tsp200715092001_20200715074120" />
        <type value="d" />
        <modification value="2020-07-15T06:41:59.000Z" />
        <permissions value="rwxr-Sr--" />
        <owner value="1000130000" />
        <group value="0" />
      </file>
    </files>
    <result success="true" />
  </ls>
</session>

Tags: in标记permissionsvaluesessiontypegrouptar
2条回答
for filename in filetag.findall('../{*}filename'):

由于..,这将在file元素的父元素中查找filename(即,作为file的兄弟元素)。它应该是一个.

此外,在Python3.8中添加了名称空间通配符。您没有指明正在使用哪个Python版本,因此这可能也是一个问题

无论如何,您最好“正确地”使用名称空间,而不是寻找快捷方式,这有点冗长,但几乎不难

NS = {'scp': 'http://winscp.net/schema/session/1.0'}
for filetag in root.findall('.//scp:file', NS):
    for filename in filetag.findall('./scp:filename', NS):
        if ".tar" in filename.get('value', ''):
            print(filename)
            dates.append(filename)

以下是一行:

import xml.etree.ElementTree as ET

xml = '''

<session xmlns="http://winscp.net/schema/session/1.0" name="user@11.11.111.11" start="2020-07-22T10:01:12.939Z">
  <ls>
    <destination value="/folder/processing" />
    <files>
      <file>
        <filename value="." />
        <type value="d" />
        <modification value="2020-07-22T08:57:28.000Z" />
        <permissions value="rwxrwsrwx" />
        <owner value="1000130000" />
        <group value="0" />
      </file>
      <file>
        <filename value=".." />
        <type value="d" />
        <modification value="2020-07-22T08:51:15.000Z" />
        <permissions value="rwxrwxrwx" />
        <owner value="1000130000" />
        <group value="0" />
      </file>
      <file>
        <filename value="package_tsp200715092001_20200715074120.tar" />
        <type value="-" />
        <size value="4014536192" />
        <modification value="2020-07-15T06:41:12.000Z" />
        <permissions value="rw-rw-rw-" />
        <owner value="1005" />
        <group value="1005" />
      </file>
      <file>
        <filename value="package_tsp200715092001_20200715074120" />
        <type value="d" />
        <modification value="2020-07-15T06:41:59.000Z" />
        <permissions value="rwxr-Sr " />
        <owner value="1000130000" />
        <group value="0" />
      </file>
    </files>
    <result success="true" />
  </ls>
</session>
'''

NS = {'scp': 'http://winscp.net/schema/session/1.0'}
root = ET.fromstring(xml)
tar_files_dates = [f.find('./scp:modification',NS).attrib['value'] for f in root.findall('.//scp:file',NS) if '.tar' in f.find('./scp:filename',NS).attrib['value']]
print(tar_files_dates)

输出

['2020-07-15T06:41:12.000Z']

相关问题 更多 >