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'