I have a large XML file that I want to parse, and only print one specific value if two values are met.
This is the code so far:
#!/usr/local/bin/python
import xml.etree.ElementTree as ET
tree = ET.parse('onedb-dhcp.xml')
root = tree.getroot()
# This successfully gets all items in the xml:
print 'This successfully gets all items in the xml:\n'
for p in root.iter('PROPERTY'):
print p.attrib
print '\n----------------------------------------------------------'
This is the sample xml file:
<DATABASE NAME="test" VERSION="43-39" MD5="." SCHEMA-MD5="." INT-VERSION="43-39">
<OBJECT><PROPERTY NAME="__type" VALUE="dhcp.lease"/><PROPERTY NAME="is_invalid_mac" VALUE="false"/><PROPERTY NAME="deferred_ttl" VALUE="300"/><PROPERTY NAME="ack_state" VALUE="renew"/><PROPERTY NAME="v6_prefix_bits" VALUE="0"/><PROPERTY NAME="is_ipv4" VALUE="true"/><PROPERTY NAME="vnode_id" VALUE="79"/><PROPERTY NAME="node_id" VALUE="79"/><PROPERTY NAME="ip_address" VALUE="10.10.1.6"/><PROPERTY NAME="dhcp_range" VALUE="10.10.1.5/10.10.1.254///0/"/><PROPERTY NAME="network_view" VALUE="0"/><PROPERTY NAME="starts" VALUE="2 2017/01/17 04:58:52"/><PROPERTY NAME="ends" VALUE="6 2017/01/21 04:58:52"/><PROPERTY NAME="tstp" VALUE="1 2017/01/23 04:58:52"/><PROPERTY NAME="tsfp" VALUE="1 2017/01/23 04:58:52"/><PROPERTY NAME="atsfp" VALUE="1 2017/01/23 04:58:52"/><PROPERTY NAME="cltt" VALUE="2 2017/01/17 04:58:52"/><PROPERTY NAME="hardware" VALUE="00:1a:4b:26:fd:85"/><PROPERTY NAME="client_hostname" VALUE=""printer1""/><PROPERTY NAME="binding_state" VALUE="active"/><PROPERTY NAME="next_binding_state" VALUE="expired"/><PROPERTY NAME="variable" VALUE="vendor-class-identifier="Hewlett-Packard JetDirect" ddns-fwd-name="printer1.testing.net" ddns-rev-name="6.1.10.10.in-addr.arpa." ddns-txt="0015dce5883b53fa75c8d90d1312f0c054" lt="04294967295""/><PROPERTY NAME="ms_server_id" VALUE="."/><PROPERTY NAME="fingerprint" VALUE="HP Printer"/><PROPERTY NAME="fingerprint_class" VALUE="Printers"/></OBJECT>
<OBJECT><PROPERTY NAME="__type" VALUE="dhcp.lease"/><PROPERTY NAME="is_invalid_mac" VALUE="false"/><PROPERTY NAME="deferred_ttl" VALUE="300"/><PROPERTY NAME="ack_state" VALUE="from_peer"/><PROPERTY NAME="v6_prefix_bits" VALUE="0"/><PROPERTY NAME="is_ipv4" VALUE="true"/><PROPERTY NAME="vnode_id" VALUE="86"/><PROPERTY NAME="node_id" VALUE="86"/><PROPERTY NAME="ip_address" VALUE="10.10.1.44"/><PROPERTY NAME="dhcp_range" VALUE="10.10.1.5/101.10.1.254///0/"/><PROPERTY NAME="network_view" VALUE="0"/><PROPERTY NAME="starts" VALUE="2 2017/01/17 04:58:52"/><PROPERTY NAME="ends" VALUE="6 2017/01/21 04:58:52"/><PROPERTY NAME="tstp" VALUE="4 2016/06/23 19:17:54"/><PROPERTY NAME="tsfp" VALUE="1 2017/01/23 04:58:52"/><PROPERTY NAME="atsfp" VALUE="1 2017/01/23 04:58:52"/><PROPERTY NAME="cltt" VALUE="5 2016/06/17 19:17:54"/><PROPERTY NAME="hardware" VALUE="00:1a:4b:26:fd:85"/><PROPERTY NAME="client_hostname" VALUE=""printer2""/><PROPERTY NAME="binding_state" VALUE="active"/><PROPERTY NAME="next_binding_state" VALUE="expired"/><PROPERTY NAME="variable" VALUE="lt="345600" ddns-txt="0015dce5883b53fa75c8d90d1312f0c054" ddns-rev-name="44.1.10.10.in-addr.arpa." ddns-fwd-name="printer2.testing.net" vendor-class-identifier="Hewlett-Packard JetDirect""/><PROPERTY NAME="ms_server_id" VALUE="."/></OBJECT>
</DATABASE>
When I run the above script, this is what I get printed to screen (just a sample):
{'NAME': '__type', 'VALUE': 'dhcp.lease'}
{'NAME': 'is_invalid_mac', 'VALUE': 'false'}
{'NAME': 'deferred_ttl', 'VALUE': '300'}
{'NAME': 'ack_state', 'VALUE': 'renew'}
{'NAME': 'v6_prefix_bits', 'VALUE': '0'}
{'NAME': 'is_ipv4', 'VALUE': 'true'}
{'NAME': 'vnode_id', 'VALUE': '79'}
{'NAME': 'node_id', 'VALUE': '79'}
{'NAME': 'ip_address', 'VALUE': '10.10.1.6'}
How can I set it up to only print the ip_address
value if _type
= dhcp.lease
?
I've tried this:
l = 'dhcp.lease'
ip = 'ip_address'
for s in root.iter('PROPERTY'):
n = s.attrib['NAME']
d = s.attrib['VALUE']
if d == l:
print s.attrib['VALUE']
That prints out this:
Searching for specific things...
dhcp.lease
dhcp.lease
I think I'm close to the finish line, but need some help getting over it.