2014-12-15 23 views
8

XML yapılandırmasını ayrıştırmak için xmltodict kullanıyorum.1'den n öğelerine taşıyın

<items> 
    <item-ref>abc</item-ref> 
</items> 

ve

<items> 
    <item-ref>abc</item-ref> 
    <item-ref>dca</item-ref> 
    <item-ref>abb</item-ref> 
</items> 

şöyle ben xmltodict ile bu ayrıştırma ediyorum: XML unsuru hem geçerlidir 1 n durumlarda, oluşabilir yapıları vardır

document['items']['item-ref'] 

ve tek bir unicode veya bir liste (bulunan öğelere bağlı olarak) geri verir, bu yüzden bir liste veya dize işlemek zorunda kaldığımdan emin olmak için her zaman ek bir kontrol eklemem gerekir:

if isinstance(document['items']['item-ref'], list): 
    my_var = document['items']['item-ref'] 
else: 
    my_var = [document['items']['item-ref']] #create list manually 

Bunların üstesinden gelmek için daha iyi/daha basit/daha zarif bir yol var mı?

+1

aynı sorunla karşılaştı ve her şeyi denetler:) – dm03514

+0

Ellerinizi biraz teensy kirli hale getirmek istiyorsanız, xmltodict.py işlevini kopyalayabilirsiniz. Listelere dönüşecek öğeleri belirleyen bir _DictSAXHandler.push_data yöntemi vardır. Argümanları değiştirebilir, böylece ayrıştırıcıyı bir dizi öğeyi * her zaman * listeye dönüştürebilirsiniz. –

cevap

3

Bunu yapmanın süper zarif bir yol olduğundan emin değilim. Python'un tek bir kod satırında bunu yapmanıza yardımcı olacak yerleşik yöntemleri veya işlevleri yoktur. Yine de, kod birleştirmek için bir şeyler yapmak isteyeceksiniz. Matsjoyce, bir yorumda bahsettiğiniz gibi, bu mantığı sizin için halledecek bir işlev yaratmak isteyebilirsiniz.

my_var = listn(document['items']['item-ref']) 

(Benim ilk cevap:

def listn(val=None): 
    if val is None: 
     return [] 
    return val if isinstance(val, list) else [val] 

>>> listn([1, 2, 3]) 
[1, 2, 3] 
>>> listn() 
[] 
>>> listn(3) 
[3] 

Artık sadece, bir list olup olmadığı, döndürülecek bir int veya NoneType nesneyi sizin val ile bu işlevi çağırmak ve bir list bekleyebilirsiniz list bir alt sınıf oluşturdu, ancak 4 yerine 6 satır alır ve en ideal yan etkiyi değil type değiştirir.)

+0

Bu sadece bir işlev olarak daha hoş olmaz mıydı? Bunu tek linerde yapabilirsiniz: 'listify = lambda x: x isinstance (x, list) else [x]' – matsjoyce

+0

Yeterince adil. Tek lineli kullanacağımdan emin değilim, ancak özellikle 'Hiçbiri' değerlerini de karşılayabiliyorsa, bir fonksiyon daha kolay olacaktır. Cevabımı yukarıda güncelledim. –

+0

Bu, kodumu daha basit ve kompakt hale getiren iyi bir yaklaşım. – balas

İlgili konular