从xml文档中获取子项

时间:2018-12-31 18:52:16

标签: python xml

我有以下XML文档,我试图找到一种方法来传递主机名,然后获取该主机名的以下host-ip条目。

以下是以下示例xml文档:

<ReportHost name="WebServerA.internal">
<HostProperties>
<tag name="traceroute-hop-5">10.1.1.5</tag>
<tag name="traceroute-hop-4">10.3.4.2</tag>
<tag name="traceroute-hop-3">10.5.10.25</tag>
<tag name="traceroute-hop-2">10.54.22.122</tag>
<tag name="cpe-1">cpe:/a:microsoft:iis:8.5</tag>
<tag name="cpe">cpe:/o:microsoft:windows</tag>
<tag name="traceroute-hop-1">10.10.10.54</tag>
<tag name="patch-summary-total-cves">14</tag>
<tag name="cpe-0">cpe:/o:microsoft:windows_server_2012:r2</tag>
<tag name="system-type">general-purpose</tag>
<tag name="operating-system">Microsoft Windows Server 2012 R2 Standard</tag>
<tag name="LastUnauthenticatedResults">1545398521</tag>
<tag name="Credentialed_Scan">false</tag>
<tag name="policy-used">Basic Network Scan</tag>
<tag name="os">windows</tag>
<tag name="mac-address">00:10:36:A5:3B:AA</tag>
<tag name="host-fqdn">WebServerA.internal</tag>
<tag name="host-rdns">WebServerA.internal</tag>
<tag name="traceroute-hop-0">10.1.5.12</tag>
<tag name="HOST_END">Fri Dec 21 08:22:01 2018</tag>
<tag name="netbios-name">WEBSERVERA</tag>
<tag name="host-ip">10.1.5.33</tag>
<tag name="HOST_START">Fri Dec 21 08:16:28 2018</tag>
</HostProperties>
</ReportHost>

for host in root.iter('HostProperties'):
    for child in host:
        # If i print attrib from loop above i only see name:value pairs,  but i can't seem to get the value for host-ip
        print(child.attrib.get('name:host-ip')) *** THIS DOESN'T WORK ***

2 个答案:

答案 0 :(得分:1)

  ...
  <tag name="netbios-name">WEBSERVERA</tag>
  <tag name="host-ip">10.1.5.33</tag>
  <tag name="HOST_START">Fri Dec 21 08:16:28 2018</tag>
</HostProperties>

遍历HostProperties时,您将把所有<tag>元素作为子元素。属性是元素的attribute(name),文本将为您提供标记内定义的值。

for child in host:
    print( child.name , child.attrib.name , child.text )

>> ... 
>> tag netbios-name WEBSERVERA
>> tag host-ip 10.1.5.33
>> tag HOST_START Fri Dec 21 08:16:28 2018

更新

解析(sax)和DOM并不总是相同的。也就是说,如果您想关联文档中的两件事,则需要在内部以某种方式对文档进行建模。

hosts = {} 
...
for child in host: 
   hosts[child.attrib.name] = child.text
print("{} : {}".format(hosts['netbios-name'],hosts['host-ip']))


>> WEBSERVERA : 10.1.5.33

如果有多个主机属性(仅显示一个),则可以创建一个类似于{'WEBSERVERA':{'host-ip':...的映射

话虽如此,您的xml结构仍有很多不足之处。如果您可以更改架构,则将有助于您解析它。例如,如果name字段在hostproperties对象中很重要,则它应该是hostproperties的属性或例如名为name的元素。由于tag中包含所有元素,因此很难解析或查找@ alfredo-aguirre提及的内容。


再次更新 https://docs.python.org/2/library/xml.dom.html

以下是使用DOM(文档对象模型)的代码段

https://repl.it/@mark_boyle_sp/StimulatingStimulatingTypes

答案 1 :(得分:0)

发布代码后,您必须遍历所有子项,直到找到所需的标签。

除了这样做,您还可以使解析器直接访问所需的属性:

import xml.etree.ElementTree as ET
# XML payload redacted:
xml_text = "<xml>...</xml>"
root = ET.fromstring(xml_text)
for tag in root.findall("./HostProperties/tag[@name='host-ip']"):
    print(tag.text)