python - 从 xml 文档中获取子项
问题描述
我有以下 XML 文档,我正在尝试找到一种方法来传递主机名,然后获取该主机名的以下主机 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 ***
解决方案
...
<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>
元素作为子元素。属性是元素属性(名称),文本将为您提供标签内定义的值。
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
更新
parsing(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(文档对象模型)的片段
推荐阅读
- ms-access - 可以根据组合框选择动态设置 SendObject 中的“收件人:”字段吗?
- android-studio - Android Studio 中的模拟器有问题。小屏幕和应用程序无法运行
- r - 管道语句中的舍入向量仅产生向量中的第一个元素
- php - 遍历订单项目时如何检查自定义复选框产品元的值
- node.js - 针对不同 Node.js 版本编译的模块 - SQLite3 错误
- r - 无法在 R Shiny 中生成图
- javascript - 名称为零的 JSON
- php - 使用 REST api 登录用户
- excel - 无法在不同项目的模块之间传递 UDT
- drupal - 如何获得测试帐户以在 Drupal Commerce 上试用 SagePay