2017-01-22 5 views
1

구문 분석하려는 큰 XML 파일이 있으며 두 값이 일치하면 특정 값 하나만 인쇄합니다.두 개의 조건을 만족하는 특정 xml 값만 인쇄하십시오.

이 지금까지 코드 :

#!/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----------------------------------------------------------' 

이 샘플 XML 파일은 : 나는 위의 스크립트를 실행하면

<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="&quot;printer1&quot;"/><PROPERTY NAME="binding_state" VALUE="active"/><PROPERTY NAME="next_binding_state" VALUE="expired"/><PROPERTY NAME="variable" VALUE="vendor-class-identifier=&quot;Hewlett-Packard JetDirect&quot; ddns-fwd-name=&quot;printer1.testing.net&quot; ddns-rev-name=&quot;6.1.10.10.in-addr.arpa.&quot; ddns-txt=&quot;0015dce5883b53fa75c8d90d1312f0c054&quot; lt=&quot;04294967295&quot;"/><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="&quot;printer2&quot;"/><PROPERTY NAME="binding_state" VALUE="active"/><PROPERTY NAME="next_binding_state" VALUE="expired"/><PROPERTY NAME="variable" VALUE="lt=&quot;345600&quot; ddns-txt=&quot;0015dce5883b53fa75c8d90d1312f0c054&quot; ddns-rev-name=&quot;44.1.10.10.in-addr.arpa.&quot; ddns-fwd-name=&quot;printer2.testing.net&quot; vendor-class-identifier=&quot;Hewlett-Packard JetDirect&quot;"/><PROPERTY NAME="ms_server_id" VALUE="."/></OBJECT> 
</DATABASE> 

, 이것은 내가 (단지를 화면에 인쇄받을 것입니다 샘플) : 나는 그것을 설정할 수 있습니다

{'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'} 

만경우 ip_address 값을 출력하는 방법= dhcp.lease?

나는이 시도했다 :

출력합니다
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'] 

이 :

Searching for specific things... 

dhcp.lease 
dhcp.lease 

내가 결승선에 가까운 해요,하지만 그것을 극복 도움이 필요합니다 생각합니다.

답변

1

먼저 모든 개체를 반복해야합니다. "dhcp.lease"로 속성을 찾으면 개체의 "ip_adress"를 출력합니다.

이 시도 :

for obj in tree.iter('OBJECT'): 

    # Build a dictionary from NAME and VALUE of each property 
    properties = dict([ 
     (p.attrib['NAME'], p.attrib['VALUE']) 
     for p in obj.iter('PROPERTY') 
    ]) 

    # Skip this object if it's not a dhcp lease 
    if properties['__type'] != 'dhcp.lease': 
     continue 

    print properties['ip_address'] 

를 내가 쉽게 조회 할 수있는 사전을 만들 수 있도록 내가, 당신의 재산은 고유 한 이름을 가지고 여기에 있으리라 믿고있어.

더 많은 수표를 추가하기 위해 나중에 확장하려면 인쇄하기 전에 if 문을 더 추가 할 수 있습니다. 뭔가 (유효하지 않은 파이썬) : if properties['ends'] < now + 7 days: continue

+0

좀 더 가까이에있어. 이 기준을 충족하는 항목의 수를 발견하지만, 인쇄 값 대신 브라켓입니다 : 얻기 IP를 ... [] [] [] [] [] –

+0

만 [] 후가 나타나면 NAME == 'ip_address'속성이 없습니다. '[ '1.2.3.4']'와 같은 것을 얻으면 마지막 줄의'] [0])'로 대체하십시오. – fafl

+0

예 빈 괄호 –