【问题标题】:Retrieve XML parent and child attributes using Python and lxml使用 Python 和 lxml 检索 XML 父子属性
【发布时间】:2014-02-01 09:53:38
【问题描述】:

我正在尝试在 Python / lxml 中使用 XPATH 处理 XML 文件。

我可以使用以下代码提取树的特定级别的值:

file_name = input('Enter the file name, including .xml extension: ') # User inputs file name
print('Parsing ' + file_name)

from lxml import etree

parser = etree.XMLParser()
tree = etree.parse(file_name, parser)

r = tree.xpath('/dataimport/programmelist/programme')
print (len(r))

with open(file_name+'.log', 'w', encoding='utf-8') as f:        
   for r in tree.xpath('/dataimport/programmelist/programme'):
        progid = (r.get("id"))
        print (progid)

它按预期返回值列表。我还想返回一个“孩子”的值(它存在的地方),但我不知道如何(我只能让它作为一个单独的列表工作,但我需要维护它们之间的链接)。

注意:我会将这些值写入日志文件,但由于我没有成功获取我想要的所有内容,因此我还没有添加“写出”代码。

这是 XML 的结构:

<dataimport dtdversion="1.1">
   <programmelist>
      <programme id="eid-273168">
         <imageref idref="img-1844575"/>

如何让 Python 返回 id + idref?

我之前使用的示例有命名空间,但这个文件没有。

【问题讨论】:

  • 您的示例代码不一致。你在哪里使用ftree 是什么?您是在阅读文件还是在其中写入文件?
  • 已更新 - 抱歉,应该首先包含它
  • 我已经在上面的正文中添加了它,但请注意,结果最终会写入日志文件(因此引用了'with open(file_name'.log, 'w'. ..)

标签: python xml xpath lxml


【解决方案1】:

由于xpath()方法返回树,你可以再次使用xpath获取你想要的idref列表:

for r in tree.xpath('/dataimport/programmelist/programme')
    progid = r.get("id")
    ref_list = r.xpath('imageref/@idref')
    print progid, ref_lis

【讨论】:

  • 行得通,谢谢!如何摆脱方括号和引号?我尝试使用 str() 然后剪切它,但它不起作用。
  • @Nick:ref_list 是一个普通的python列表,所以python字符串方法join()就足够了:print "%s: %s" % (progid, " ".join(ref_list))
猜你喜欢
  • 1970-01-01
  • 2017-07-13
  • 1970-01-01
  • 1970-01-01
  • 2020-01-25
  • 2013-03-30
  • 1970-01-01
  • 2013-02-28
  • 2016-05-02
相关资源
最近更新 更多