使用Python ElementTree查找和编辑XML中的子元素
因为我正在处理的XML文件有不一致的子元素,所以我在查找和编辑一个特定的子元素时遇到了一些困难,这个子元素直到文件的下一步才出现在元素序列中。 我正在使用Python 2.7.1中包含的Python元素树 下面是我正在处理的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 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。目前,您的解决方案运行良好!再次感谢。