【问题标题】:Parsing nested attributes解析嵌套属性
【发布时间】:2020-01-01 17:48:04
【问题描述】:

亲爱的开发者们好。 我无法完全解析 xml 文件。

结构看起来像

<foo>
   <bar1 id="1">
      <bar2>
        <foobar id="2">name1</foobar>
        <foobar id="3">name2</foobar>
     </bar2>
   </bar1>
</foo>

我使用了 xml.etree 库,所以我使用如下代码:

source.get('Id')

所以我得到了第一个属性

要获得嵌套标签,我使用如下代码: source.find('bar/foobar').text

问题是如何获取下一个嵌套属性?(Id =2 and id = 3) 当我尝试使用一些带有斜线的东西时,它会显示一个错误 source.get('bar/id') 其他尝试只给了我已经获得的第一个属性,第二个嵌套属性也具有相同的名称 ID。

提前感谢您的帮助。

【问题讨论】:

  • 您希望我们帮助您,对吗?所以不要说“当我尝试使用某些东西时它显示错误......”。告诉我们你做了什么以及它是如何失败的,然后我们可以帮助你。

标签: python xml parsing


【解决方案1】:

下面是一个工作示例

import xml.etree.ElementTree as ET

xml = '''<foo>
   <bar1 id="1">
      <bar2>
        <foobar id="2">name1</foobar>
        <foobar id="3">name2</foobar>
     </bar2>
   </bar1>
</foo>'''

root = ET.fromstring(xml)
ids = [f.attrib.get('id') for f in root.findall('.//foobar')]
print(ids)

输出

['2','3']

【讨论】:

    【解决方案2】:

    您需要指定一个有效的 XPATH 表达式,例如:

    foobars = source.findall('bar1/bar2/foobar')
    for elem in foobars:
        print(elem.get('id'))
    

    输出:

    2
    3
    

    【讨论】:

      【解决方案3】:

      它现在适用于一条线,但是如果我们有多个 bar1 怎么办?像这样

      <foo>
         <bar1 id="1">
            <bar2>
              <foobar id="2">name1</foobar>
              <foobar id="3">name2</foobar>
           </bar2>
         </bar1>
         <bar1 id="2">
            <bar2>
              <foobar id="2">name3</foobar>
              <foobar id="3">name4</foobar>
           </bar2>
         </bar1>
      </foo>
      

      循环 (findall=> for) 将打印所有的 (4 个 id),但我每行只需要 2 个

      【讨论】:

        猜你喜欢
        • 2019-03-31
        • 2017-01-07
        • 1970-01-01
        • 2011-01-11
        • 1970-01-01
        • 1970-01-01
        • 2020-01-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多