Python 从xml文档中获取子项
我有下面的XML文档,我正试图找到一种方法来传递主机名,然后获取该主机名的以下主机ip条目 以下是以下示例xml文档:Python 从xml文档中获取子项,python,xml,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 n
<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 ***
10.1.1.5
10.3.4.2
10.5.10.25
10.54.22.122
cpe:/a:microsoft:iis:8.5
cpe:/o:microsoft:windows
10.10.10.54
14
cpe:/o:microsoft:windows\u服务器\u 2012:r2
通用型
Microsoft Windows Server 2012 R2标准
1545398521
假的
基本网络扫描
窗户
00:10:36:A5:3B:AA
WebServerA.internal
WebServerA.internal
10.1.5.12
2018年12月21日星期五08:22:01
网络服务器
10.1.5.33
2018年12月21日星期五08:16:28
对于root.iter中的主机(“主机属性”):
对于主机中的子级:
#如果我从上面的循环打印attrib,我只会看到name:value对,但似乎无法获取主机ip的值
打印(child.attrib.get('name:host ip'))***这不起作用***
更新 解析(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
如果有多个hostproperties(仅显示一个),则可以创建类似于{'WEBSERVERA':{'host-ip':…
也就是说,xml的结构还有很多需要改进的地方。如果您可以更改模式,它将有助于您分析模式。例如,如果hostproperties对象中的name
字段很重要,那么它应该是hostproperties的一个属性或一个名为name
的元素。将所有元素都包含在这里有一个标签
,很难解析或找到@alfredo aguirre提到的类似内容
再次更新 下面是一个使用DOM(文档对象模型)的代码段
发布代码后,您必须迭代所有子项,直到找到所需的标记 不必这样做,您可以让解析器直接访问所需的属性:
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)
将xml.etree.ElementTree作为ET导入
#XML有效负载已编辑:
xml_text=“…”
root=ET.fromstring(xml\u文本)
对于root.findall(“./HostProperties/tag[@name='host-ip']”)中的标记:
打印(tag.text)
wow,非常感谢,有没有一种方法可以将主机名“WebServerA”这样的值传递给它,然后让它给我主机ip?嘿,谢谢,我刚刚尝试了这个方法,但它似乎不起作用,不确定我在哪里弄乱了语法:for host in root.iterfind(“//HostProperties/tag/name/[@host-fqdn='WebServerA.internal']”:打印vuln.text,它将是/HostProperties/tag[@name='host-fqdn']]
,但它将仅从xml解析fqdn并遍历它们。
hosts = {}
...
for child in host:
hosts[child.attrib.name] = child.text
print("{} : {}".format(hosts['netbios-name'],hosts['host-ip']))
>> WEBSERVERA : 10.1.5.33
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)