用Python替换XML元素

5

我希望用一组新的坐标替换bbox中的元素。

我的代码:

    # import element tree
    import xml.etree.ElementTree as ET 


    #import xml file
    tree = ET.parse('C:/highway.xml')
    root = tree.getroot()

    #replace bounding box with new coordinates

    elem = tree.findall('bbox')
    elem.txt = '40.5,41.5,-12.0,-1.2'

我的 XML 文件:

   <geoEtl>
    <source>
        <server>localhost</server>
        <port>xxxx</port>
        <db>vxxx</db>
        <user>xxxx</user>
        <passwd>xxxx</passwd>
    </source>
    <targetDir>/home/firstuser/</targetDir>
    <bbox>-52.50,-1.9,52.45,-1.85</bbox>
    <extractions>
        <extraction>
            <table>geo_db_roads</table>
            <outputName>highways</outputName>
            <filter>highway = 'motorway'</filter>
            <geometry>way</geometry>
            <fields>
                <field>name</field>             
            </fields>
        </extraction>
    </extractions>
   </geoEtl>

我已经尝试了多种方法来做这里找到的事情,但似乎并没有起作用。谢谢。

我收到的错误如下:

line 20, in <module> elem.txt = '40.5,41.5,-12.0,-1.2' AttributeError: 'list' object has no attribute 'txt'

当你尝试时会发生什么? - abarnert
第20行,在<模块>中 elem.txt = '40.5,41.5,-12.0,-1.2' 属性错误:'list'对象没有属性'txt' - Moggy
4个回答

9

findall函数顾名思义,它会找到所有匹配的元素,而不仅仅是一个。

因此,执行以下操作:

elem = tree.findall('bbox')

elem 是一个由 Element 组成的列表。和其他列表一样,如下代码:

elem.txt = '40.5,41.5,-12.0,-1.2'

会给你一个错误:

AttributeError: 'list' object has no attribute 'txt'

如果您想对列表中的每个成员执行某些操作,则必须对其进行循环:

elems = tree.findall('bbox')
for elem in elems:
    elem.txt = '40.5,41.5,-12.0,-1.2'

好的,太棒了,现在它可以顺利运行了。那么,它应该会将新坐标重写到我的XML文件中,还是这是另一个问题? - Moggy
2
@Moggy:ET.parse('C:/highway.xml')仅将文件解析为内存中的树。如果您想修改XML文件,必须编辑树,然后将其保存回文件。如果要使用新文件覆盖原始版本,则可以执行tree.write('C:/highway.xml') - abarnert

3
如果您的文件没有更新,很可能是因为您没有保存它,您可以使用 tree.write 方法来完成这项任务。
tree.write('output.xml')

1
# import element tree
import xml.etree.ElementTree as ET 

#import xml file
tree = ET.parse('C:/highway.xml')
root = tree.getroot()

elems = root.findall(".//bbox")

for elem in elems:
    elem.text = '40.5,41.5,-12.0,-1.2'

tree.write('C:/highway.xml')

0
如果您想将所有边界框的文本替换为'40.5,41.5,-12.0,-1.2',请尝试以下操作。
bboxes = tree.xpath('//bbox')
for bbox in bboxes:
    bbox.text= '40.5,41.5,-12.0,-1.2'

2
我收到了 AttributeError: 'ElementTree' 对象没有属性 'xpath' 的错误。 - Moggy
是的 - 抱歉。我也有更简单的解析代码 - 我使用etree作为我的基类,而etree包括xpath函数。我曾经假设ElementTree也有这个功能,但我从未双重检查过。 - kamjagin
@kamjagin:任何地方都没有名为“etree”的类。在2.x和3.x标准库中,etree是一个仅包含ElementTree模块的包;在Fredrick Lundh网站上的可单独安装的模块中,没有任何东西具有那个名字;在lxml中,etree是一个具有与其他模块大致相同API的模块。Element处理findall方法中的XPath语法;在lxml实现中,您也可以将其称为xpath,但仍然要在Element上调用它,而不是在某个空包上调用它作为基类。 - abarnert

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接