【问题标题】:Replacing XML element in Python在 Python 中替换 XML 元素
【发布时间】:2013-07-02 22:51:33
【问题描述】:

我正在尝试用一组新坐标替换 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' –

【问题讨论】:

  • 尝试时会发生什么?
  • 第 20 行,在 elem.txt = '40.5,41.5,-12.0,-1.2' AttributeError: 'list' object has no attribute 'txt'

标签: python xml elementtree


【解决方案1】:

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

那么,在这之后:

elem = tree.findall('bbox')

elemElements 的列表。而且,与任何其他列表一样,这是:

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'

【讨论】:

  • ok,它现在运行没问题,是重写我的 XML 文件上的新坐标还是另一个问题?
  • @Moggy: ET.parse('C:/highway.xml') 只是将文件解析为内存中的树。如果你想修改 XML 文件,你必须编辑树,然后 _save 它回到一个文件_. You can do tree.write('C:/highway.xml')` 如果你想用新的。
【解决方案2】:

如果您的文件没有更新,很可能是因为您没有保存它,您可以使用tree.write 方法来做到这一点。

tree.write('output.xml')

【讨论】:

    【解决方案3】:
    # 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')
    

    【讨论】:

      【解决方案4】:

      如果你想用'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'
      

      【讨论】:

      • 我得到 AttributeError: 'ElementTree' object has no attribute 'xpath'
      • 是的 - 对不起。我的解析代码也稍微简单一些——我使用 etree 作为我的基类,并且 etree 包含 xpath 函数。我曾认为 ElementTree 也有,但我从未仔细检查过它
      • @kamjagin:任何地方都没有名为etree 的类。在 2.x 和 3.x 标准库中,etree 是一个包,其中只有 ElementTree 模块;在 Fredrick Lundh 网站的可单独安装的模块中,根本没有这个名称;在lxml 中,etree 是一个模块,其API 与其他模块中的ElementTree 大致相同。 Elementfindall 方法中处理 XPath 语法;在lxml 实现中,您也可以将其称为xpath,但您仍然可以在Elements 上调用它,而不是您以某种方式用作基类的空包。
      猜你喜欢
      • 2015-03-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多