【问题标题】:Find and Edit SubElement in XML using Python ElementTree使用 Python ElementTree 在 XML 中查找和编辑子元素
【发布时间】:2013-02-17 18:57:11
【问题描述】:

因为我正在处理的 XML 文件具有不一致的子元素,所以我在查找和编辑特定子元素时遇到了一些困难,该子元素直到文件的更下方才出现在一系列元素中。 我正在使用 Python 2.7.1 中包含的 Python 的 ElementTree。

这是我正在处理的 XML 文件类型的示例:

<?xml vin="1.0" encoding="UTF-8" standalone="yes"?>

<whatever id='Subaru' YouCanDriveMyCar='Wednesday' transmission='stick'>
        <model id='Ford' year='1972'>A</model>
        <model id='Chevrolet' vin="1234567890" stereo='Alpine' airconditioning='notworking'>Volt</model>
        <model id='Dodge' vin="3456789012" airconditioning='working'>Durango</model>
        <model id='Mercedes' vin="4567890123" airconditioning='none'>S150</model>
        <model id='BMW'>M350</model>
        <model id='Volkswagen' vin="5678901234" stereo='Sony'>Beetle</model>
        <model id='Honda' vin="6789012345" airconditioning="blowsicecubes">Accord</model>
</whatever>

在本例中,我想找到模型 id='Volkswagen' 并将 stereo='Sony' 更改为 'Blaupunkt'。

如果我使用 ElementTree 搜索属性“stereo”,则会出错,因为文件顶部的元素中不包含“stereo”。

任何帮助或提示将不胜感激。

【问题讨论】:

    标签: python xml xml-parsing elementtree


    【解决方案1】:

    使用简单的 XPath 表达式找到正确的模型:

    volkswagen = tree.find('.//model[@id="Volkswagen"]')
    

    然后简单地调整stereo属性:

    volkswagen.set('stereo', 'Blaupunkt')
    

    您还可以搜索具有stereo 属性的model 元素:

    models_with_stereos = tree.findall('.//model[@stereo]')
    

    然后对这些元素进行进一步过滤。

    如果您切换到使用 lxml(ElementTree API 的替代实现),您仍然可以使用更复杂的 XPath 表达式,包括仅将 model 元素与 id="Volkswagen"stereo 属性匹配。

    【讨论】:

    • @J.F.Sebastian:感谢您的提醒。
    • 非常感谢Martijn!它奏效了,让我更接近解决方案。我在 Windows 平台上工作并查看了 lxml,但正确配置 lxml 似乎 Windows 有点痛苦。一旦我有更多时间,我一定会看看 lxml 。目前,您的解决方案运行良好!再次感谢。
    猜你喜欢
    • 1970-01-01
    • 2015-05-05
    • 2018-08-27
    • 2013-05-01
    • 2014-11-15
    • 1970-01-01
    • 2016-09-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多