Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Python ElementTree查找和编辑XML中的子元素_Python_Xml_Xml Parsing_Elementtree - Fatal编程技术网

使用Python ElementTree查找和编辑XML中的子元素

使用Python ElementTree查找和编辑XML中的子元素,python,xml,xml-parsing,elementtree,Python,Xml,Xml Parsing,Elementtree,因为我正在处理的XML文件有不一致的子元素,所以我在查找和编辑一个特定的子元素时遇到了一些困难,这个子元素直到文件的下一步才出现在元素序列中。 我正在使用Python 2.7.1中包含的Python元素树 下面是我正在处理的XML文件类型的一个示例: <?xml vin="1.0" encoding="UTF-8" standalone="yes"?> <whatever id='Subaru' YouCanDriveMyCar='Wednesday' transmissio

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

下面是我正在处理的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>

A.
伏特
杜兰戈
S150
M350
甲虫
一致
在本例中,我想定位型号id='Volkswagen',并将stereo='Sony'更改为'Blaupunkt'

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


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

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

volkswagen = tree.find('.//model[@id="Volkswagen"]')
然后只需调整
立体声
属性:

volkswagen.set('stereo', 'Blaupunkt')
models_with_stereos = tree.findall('.//model[@stereo]')
您还可以搜索具有
立体声
属性的
模型
元素:

volkswagen.set('stereo', 'Blaupunkt')
models_with_stereos = tree.findall('.//model[@stereo]')
然后进一步过滤这些元素


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

@J.F.Sebastian:谢谢您的指导。非常感谢Martijn!它起了作用,让我更接近一个解决方案。我在一个Windows平台上工作,并研究了lxml,但Windows似乎有点难以正确配置lxml。一旦我有更多的时间,我一定会看看lxml。目前,您的解决方案运行良好!再次感谢。