2013-03-22 14 views
16

Parsuję plik XML za pomocą drzewa elementów w pythonie i zapisuję zawartość w pliku cpp.Jak mogę sprawdzić istnienie atrybutów i znaczników w XML przed analizą?

Zawartość tagów dziecięcych będzie wariantem dla różnych tagów. Na przykład pierwszy tag zdarzenia ma znacznik strony jako element podrzędny, ale drugi tag zdarzenia nie ma.

-> Jak sprawdzić, czy tag istnieje przed analizą?

-> Dzieci mają atrybut wartości w pierwszym znaczniku zdarzenia, ale nie w drugim. Jak mogę sprawdzić, czy atrybut istnieje, czy nie, przed podjęciem jego wartości.

-> Obecnie mój kod zgłasza błąd dla nieistniejącego znacznika strony i ustawia wartość atrybutu "Brak" dla drugiego znacznika podrzędnego.

<main> 
    <event> 
    <party>Big</party> 
    <children type="me" value="3"/> 
    </event> 

    <event> 
    <children type="me"/> 
    </event> 

</main> 

Kod:

import xml.etree.ElementTree as ET 
tree = ET.parse('party.xml') 
root = tree.getroot() 
for event in root.findall('event'): 
    parties = event.find('party').text 
    children = event.get('value') 

Chcę sprawdzić tagów, a następnie podjąć ich wartości.

Odpowiedz

40

Jeśli tag nie istnieje, .find() rzeczywiście zwraca None. Po prostu przetestować dla tej wartości:

for event in root.findall('event'): 
    party = event.find('party') 
    if party is None: 
     continue 
    parties = party.text 
    children = event.get('value') 

Już używać .get() na razie przetestować dla value atrybutu; zwraca także None, jeśli atrybut nie istnieje.

Atrybuty są przechowywane w słowniku .attrib, więc można użyć standardowych technik Python przetestować dla atrybutu wyraźnie zbyt:

if 'value' in event.attrib: 
    # value attribute is present. 
+0

@Martjin Pieters Wspomniałeś, jeśli strona jest None: Jak będę pisać w Pythonie, jeśli Chciałbym napisać coś w stylu: - If party! = None: – Abhishek

+4

@Abhishek: 'if party is not None'. Zobacz [operatory porównania python] (http://docs.python.org/2/reference/expressions.html#not-in). –

+0

Dzięki za wzmiankę o tym, jak sprawdzić atrybuty. Bardzo dobra odpowiedź. – SSchneid

Powiązane problemy