koddla

Yazılımcıları bilgi ile güçlendirir.

Python’da XML nasıl ayrıştırılır ve belirli bir düğüm için öznitelikler nasıl alınır?

Xml içeren bir veritabanımız olsun. Bu veritabanında birçok satır bulunsun ve biz belirli bir düğüm özniteliğinin değerlerini almak isteyelim. Bunu Python ile nasıl yaparız?

XML ağacımız şöyle görünsün:

<foo>
   <bar>
      <type foobar="1"/>
      <type foobar="2"/>
   </bar>
</foo>

Python kullanarak "1" ve "2" özniteliklerine nasıl erişeceğiz?


Bunun için ElementTree'yi kullanabiliriz. Lxml veya cElementTree gibi aynı APIyi kullanan ve Python standart kitaplığında bulunan başka uygulamalar da olsa da; bu yapıların esas olarak ekledikleri en fazla şey daha da fazla hızdır – programlama kısmının kolaylığı, tanımlayan API’ye yani ElementTree‘ye bağlıdır.

Önce XML’den bir root öğesi oluşturun. Bunun için XML işlevini kullanabilirsiniz veya aşağıdaki gibi bir dosya oluşturucusu:

import xml.etree.ElementTree as ET
root = ET.parse('thefile.xml').getroot()

Sonrasında şöyle yapacağız:

for type_tag in root.findall('bar/type'):
    value = type_tag.get('foobar')
    print(value)

minidom ile XML okuma

Bunu minidom ile yapmak isteseydik aşağıdaki gibi bir örneğimiz olacaktı:

XML:

<data>
    <items>
        <item name="item1"></item>
        <item name="item2"></item>
        <item name="item3"></item>
        <item name="item4"></item>
    </items>
</data>

Python:

from xml.dom import minidom
xmldoc = minidom.parse('items.xml')
itemlist = xmldoc.getElementsByTagName('item')
print(len(itemlist))
print(itemlist[0].attributes['name'].value)
for s in itemlist:
    print(s.attributes['name'].value)

Çıktı:

4
item1
item1
item2
item3
item4

BeautifulSoap ile XML okuma

Peki BeautifulSoup kullansaydık?

from bs4 import BeautifulSoup

x="""<foo>
   <bar>
      <type foobar="1"/>
      <type foobar="2"/>
   </bar>
</foo>"""

y=BeautifulSoup(x)
>>> y.foo.bar.type["foobar"]
u'1'

>>> y.foo.bar.findAll("type")
[<type foobar="1"></type>, <type foobar="2"></type>]

>>> y.foo.bar.findAll("type")[0]["foobar"]
u'1'
>>> y.foo.bar.findAll("type")[1]["foobar"]
u'2'

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Back to top