首页 > 解决方案 > 稍后附加到子元素

问题描述

我正在用 Python 中的 lxml.builder 构建一个 xml,但由于我的代码的性质,我想稍后找到具有属性的子元素。然后我想添加一个子元素。XML 将包含文件的哈希值及其大小和文件名。

我查看了 lxml 文档,但找不到可以满足我需求的函数。

base = etree.Element("datafile")
header = etree.Element("header")
for f in ["name", "description", "version", "author", "comment"]:
    header_var = etree.Element(f)
    if f == "category":
        header_var.text = "Standard DatFile"
    else:
        header_var.text = "-insert {}-".format(f)
    header.append(header_var)
base.append(header)

game = lb.E.game(
       lb.E.rom(name=f, size=size, crc=hash_crc32, md5=hash_md5, sha1=hash_sha1), name=filename1)
base.append(game)

在将元素附加到 XML 之后,我想稍后通过使用标记和属性game查找元素并在其中添加另一个子元素来再次访问它。它循环运行,这就是为什么我想先附加到 XML。(否则,我可能不得不制作一个字典来在插入数据之前临时存储数据)。gamenamerom

最好先确保具有该属性的标签也存在(不知道该怎么做)。

编辑:我清理了它。它忽略了 xpath 中的属性。我需要帮助让它停止忽视它。

base = etree.Element("datafile")
header = etree.SubElement(base, "header")
for f in ["name", "description", "version", "author", "comment"]:
    header_var = etree.SubElement(header, f)
    if f == "category":
        header_var.text = "Standard DatFile"
    else:
        header_var.text = "-insert {}-".format(f)

try:
        path = etree.xpath(base, "game", name=filename1)[0]
        etree.SubElement(path, "rom", name=f, size=size, crc=hash_crc32, md5=hash_md5, sha1=hash_sha1)
except:
        game = etree.SubElement(base, "game", name=filename1)
        game.SubElement(game, "rom", name=f, size=size, crc=hash_crc32, md5=hash_md5, sha1=hash_sha1)

标签: pythonlxml

解决方案


XPath 将使用game[@name = $filename]and 在 lxml 我认为而不是path = etree.xpath(base, "game", name=filename1)[0]你想要的path = base.xpath('game[@name = $filename]', filename=filename1)[0]


推荐阅读