【问题标题】:Python XML Parsing Children and grand children attributesPython XML Parsing Children 和 Grand children 属性
【发布时间】:2017-04-16 19:36:32
【问题描述】:

在过去的两周里,我一直在尝试打开和关闭它,并查看 python 的文档以进行 XML 解析。我仍然可以弄清楚它是否是 Xpath 的东西。如果有人能提供一些帮助,我将不胜感激。

我的 XML 文件有很多子文件,我正在使用 root.findall() 来获取 myAccessPoints 的属性,然后在它下面的三个子文件中我有一个元素,其中包含我想要提取的多个属性。但是,到目前为止,我只能使用 2 个 for 循环来做到这一点。

import xml.etree.ElementTree as ET



def apData():

    tree = ET.parse("project.xml")

    root = tree.getroot()
    for topLevels in root.findall("./myAccessPoints//*[@id]"):
        myApId = topLevels.get('id')
        print("AP:%s" % myApId)
        print()
        #return myApId

    for radio in root.findall("./accessPoints/accessPoint/radio/*"):
        rChannel = radio.get('primaryNumber')
        rMac = radio.get('mac')
        rSsid = radio.get('primaryNumber')
        print(rChannel, rMac, rSsid)
        #return rChannel, rMac, rSsid

以下是 XML 文件的示例:

<?xml version="1.0" encoding="UTF-8"?>
<project>
  <maps>
    <map id="0" name="floorplan" pixelsPerMeter="47.808212118953044" type="fspl"/>
  </maps>
  <accessPoints>
    <accessPoint id="0" userDefinedPosition="false">
      <radio type="measured">
        <accessPointMeasurement mac="a0:63:91:21:c4:f8" ssid="Eggs" primaryNumber="7" primaryFrequencyMhz="2442" centerNumber="7" bandwidthMhz="20" security="WPA2" informationElements="000445676773010882840b162430486c0301072a01042f010430140100000fac040100000fac040100000fac020c0032040c1218602d1afc181fffff0000000000000000000000000000000000000000003d16070017000000000000000000000000000000000000004a0e14000a002c01c8001400050019007f0101dd890050f204104a0001101044000102103b00010310470010177b8b3ae292d7c44b93d4616ff30e7e1021000d4e4554474541522c20496e632e1023000a574e44523334303076331024000a574e44523334303076331042000230311054000800060050f20400011011000a574e4452333430307633100800020004103c0001031049000600372a000120dd090010180204f0040000dd180050f2020101800003a4000027a4000042435e0062322f00">
          <technologies>
            <technology band="802.11g"/>
            <technology band="802.11b"/>
            <technology band="802.11n"/>
          </technologies>
        </accessPointMeasurement>
      </radio>
    </accessPoint>
    <accessPoint id="1" userDefinedPosition="false">

最终我会像这样使用接入点元素属性 -->

接入点标识

accessPointMeasurement mac、ssid、primaryNumber

技术乐队

技术乐队

技术乐队

一些 accessPoint 元素有 2 组无线电,所以我必须获得两次 accessPointMeasurement 属性。

我想我必须创建一个类,并且在该类中我必须在自己内部制作列表或字典。

除了了解如何在一个 for 循环中获取每个接入点及其属性(如果可能的话)之外,我并没有要求任何人为我做任何事情。

感谢您的帮助。

【问题讨论】:

    标签: python python-3.x parsing xpath xml-parsing


    【解决方案1】:

    我扩展了您的 XML 以包含更多 accessPointsradios 并使用 lxml 库来访问其 xpath 功能。嵌套循环。

    from lxml import etree
    
    tree = etree.parse('temp.xml')
    accessPoints = tree.xpath('.//accessPoint')
    
    for accessPoint in accessPoints:
        print ('accessPoint id:', accessPoint.attrib['id'])
        radios = accessPoint.xpath('radio')
        for radio in radios:
            accessPointMeasurement = radio.xpath('accessPointMeasurement')
            print ('\taccessPointMeasurement: ', accessPointMeasurement[0].attrib)
            technologies = radio.xpath('.//technology')
            for technology in technologies:
                print ('\t\ttechnology: ', technology.attrib)
    

    结果如下:

    accessPoint id: 0
        accessPointMeasurement:  {'security': 'WPA2', 'informationElements': '000445676773010882840b162430486c0301072a01042f010430140100000fac040100000fac040100000fac020c0032040c1218602d1afc181fffff0000000000000000000000000000000000000000003d16070017000000000000000000000000000000000000004a0e14000a002c01c8001400050019007f0101dd890050f204104a0001101044000102103b00010310470010177b8b3ae292d7c44b93d4616ff30e7e1021000d4e4554474541522c20496e632e1023000a574e44523334303076331024000a574e44523334303076331042000230311054000800060050f20400011011000a574e4452333430307633100800020004103c0001031049000600372a000120dd090010180204f0040000dd180050f2020101800003a4000027a4000042435e0062322f00', 'bandwidthMhz': '20', 'centerNumber': '7', 'mac': 'a0:63:91:21:c4:f8', 'ssid': 'Eggs', 'primaryFrequencyMhz': '2442', 'primaryNumber': '7'}
            technology:  {'band': '802.11g'}
            technology:  {'band': '802.11b'}
            technology:  {'band': '802.11n'}
    accessPoint id: 2
        accessPointMeasurement:  {'security': 'WPA2', 'informationElements': '000445676773010882840b162430486c0301072a01042f010430140100000fac040100000fac040100000fac020c0032040c1218602d1afc181fffff0000000000000000000000000000000000000000003d16070017000000000000000000000000000000000000004a0e14000a002c01c8001400050019007f0101dd890050f204104a0001101044000102103b00010310470010177b8b3ae292d7c44b93d4616ff30e7e1021000d4e4554474541522c20496e632e1023000a574e44523334303076331024000a574e44523334303076331042000230311054000800060050f20400011011000a574e4452333430307633100800020004103c0001031049000600372a000120dd090010180204f0040000dd180050f2020101800003a4000027a4000042435e0062322f00', 'bandwidthMhz': '20', 'centerNumber': '7', 'mac': 'a0:63:91:21:c4:f8', 'ssid': 'Eggs', 'primaryFrequencyMhz': '2442', 'primaryNumber': '7'}
            technology:  {'band': '802.11g'}
            technology:  {'band': '802.11b'}
            technology:  {'band': '802.11n'}
        accessPointMeasurement:  {'security': 'WPA2', 'informationElements': '000445676773010882840b162430486c0301072a01042f010430140100000fac040100000fac040100000fac020c0032040c1218602d1afc181fffff0000000000000000000000000000000000000000003d16070017000000000000000000000000000000000000004a0e14000a002c01c8001400050019007f0101dd890050f204104a0001101044000102103b00010310470010177b8b3ae292d7c44b93d4616ff30e7e1021000d4e4554474541522c20496e632e1023000a574e44523334303076331024000a574e44523334303076331042000230311054000800060050f20400011011000a574e4452333430307633100800020004103c0001031049000600372a000120dd090010180204f0040000dd180050f2020101800003a4000027a4000042435e0062322f00', 'bandwidthMhz': '20', 'centerNumber': '7', 'mac': 'a0:63:91:21:c4:f8', 'ssid': 'Eggs', 'primaryFrequencyMhz': '2442', 'primaryNumber': '7'}
            technology:  {'band': '802.11g'}
            technology:  {'band': '802.11b'}
            technology:  {'band': '802.11n'}
    

    【讨论】:

    • 感谢您的帮助比尔。看来我需要更多地了解 Xpaths。
    • 从我这两天给出的一两个xpath答案来看,我也能学到很多东西!如果一个人主要来自程序背景,我认为这有点棘手。可能有比我在这里提供的更好的方法。顺便说一句,如果您重视 SO 的答案,一旦您有足够的声誉,您就可以对其进行投票。这样的人。
    • 我不经常上stackoverflow,不知道你有没有兴趣,但是我有一个github账号,这个项目起来了。我会提前警告你......我是一个初学者,所以我的代码可能不可读,这可能只是浪费你的时间。 My GitHub SO 不会让我投票,但我将此帖子标记为已回答。谢谢比尔。
    • 啊,我不知道你能做到。谢谢。会看看你在做什么,看看我是否能理解。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-06
    • 1970-01-01
    • 2019-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多