Bagaimana cara mem-parsing file XML menggunakan python?

Bagaimana cara mem-parsing file XML menggunakan python?

Dari memesan bahan makanan melalui Instamart dan belanja pakaian di Myntra hingga memesan liburan di MakemyTrip, situs web menjadi sangat diperlukan dalam dekade ini! Pernah bertanya-tanya bagaimana situs web ini menampilkan informasi kepada pelanggan dengan cara yang mudah ditafsirkan dan juga memproses serta berinteraksi dengan data di backend?

Ada format file tertentu yang menjembatani kesenjangan ini, yang dapat ditafsirkan baik untuk bahasa mesin maupun manusia. Salah satu format yang banyak digunakan adalah XML, singkatan dari Extensible Markup Language.

Apa itu file XML, dan bagaimana kita menggunakannya?

File XML digunakan untuk menyimpan dan mengangkut data antara klien dan server. Ini memungkinkan kita untuk mendefinisikan data dalam format terstruktur melalui tag, atribut, dan nilai. Salah satu keunggulan utama XML adalah fleksibilitasnya. Ini dapat digunakan untuk merepresentasikan data dalam banyak format dan mudah disesuaikan dengan penggunaan baru. Ini menjadikannya pilihan populer untuk aplikasi seperti layanan web, pertukaran data, dan file konfigurasi. Pada artikel ini, saya akan membawa Anda melalui berbagai metode dalam python untuk mem-parsing file XML dengan contoh praktis.


Apakah Anda mencari Parsing XML otomatis? Coba alur kerja otomatis Nanonets. Mulai percobaan gratismu sekarang.


Memahami struktur file XML

Sebelum kita menyelami detail tentang cara mem-parsing file XML, pertama-tama mari kita pahami berbagai bagian dokumen XML. Dalam XML, sebuah elemen adalah blok bangunan mendasar dari sebuah dokumen yang mewakili sepotong terstruktur informasi. Konten elemen harus diapit di antara tag pembuka dan tag penutup selalu seperti yang ditunjukkan di bawah ini.

Harry Potter dan Batu Bertuah

Saya akan menggunakan file contoh, “travel_pckgs.xml,” yang berisi detail berbagai paket tur yang ditawarkan oleh sebuah perusahaan. Saya akan terus menggunakan file yang sama di seluruh blog untuk kejelasan.

<?xml version="1.0"?>
<travelPackages>
<package id='Paris vacation'>
<description>Experience the magnificent beauty of Paris and the french culture.</description>
<destination>Paris, France</destination>
<price>3000</price>
<duration>7</duration>
<payment>
<EMIoption>yes</EMIoption>
<refund>yes</refund>
</payment>
</package>
<package id='Hawaii Adventure'>
<description>Embark on an exciting adventure in Hawaii beaches!
</description>
<destination>Hawaii, USA</destination>
<price>4000</price>
<duration>10</duration>
<payment>
<EMIoption>no</EMIoption>
<refund>no</refund>
</payment>
</package>
<package id='Italian Getaway'>
<description>Indulge in the beauty and charm of Italy and get an all-
inclusive authentic Italian food tour!</description>
<destination>Italy</destination>
<price>2000</price>
<duration>8</duration>
<payment>
<EMIoption>yes</EMIoption>
<refund>no</refund>
</payment>
</package>
<package id='Andaman Island Retreat'>
<description>Experience the beauty of Island beaches,inclusive scuba
diving and Night kayaking through mangroves.</description>
<destination>Andaman and Nicobar Islands</destination>
<price>800</price>
<duration>8</duration>
<payment>
<EMIoption>no</EMIoption>
<refund>yes</refund>
</payment>
</package>
</travelPackages>

File tersebut memiliki data 4 paket wisata, dengan detail tujuan, deskripsi, harga, dan opsi pembayaran yang disediakan oleh agen. Mari kita lihat uraian dari berbagai bagian XML di atas:

  • Elemen Akar: Elemen level paling atas disebut sebagai root, yaitu dalam berkas kami. Ini berisi semua elemen lain (berbagai tur ditawarkan)
  • atribut: 'id' adalah atribut dari masing-masing elemen dalam file kami. Perhatikan bahwa atribut harus memiliki nilai unik ('Liburan Paris', 'Petualangan Hawaii', dll.) untuk setiap elemen. Atribut dan nilainya biasanya disebutkan di dalam tag awal seperti yang Anda lihat.
  • Elemen Anak: Elemen yang dibungkus di dalam root adalah elemen anak. Dalam kasus kami, semua   tag adalah elemen turunan, masing-masing menyimpan detail tentang paket tur.
  • Sub-Elemen: Elemen anak dapat memiliki lebih banyak sub-elemen di dalam strukturnya. Itu elemen anak memiliki sub-elemen , , , dan . Keuntungan dari XML adalah memungkinkan Anda untuk menyimpan informasi hierarkis melalui beberapa elemen bersarang. Itu sub-elemen selanjutnya memiliki sub-elemen Dan, yang menunjukkan apakah paket tertentu memiliki opsi 'bayar melalui EMI' dan pengembalian uang atau tidak.

Tip: Anda dapat membuat tampilan Pohon dari file XML untuk mendapatkan pemahaman yang jelas menggunakan ini alat. Lihat tampilan pohon hierarki dari file XML kami!

Bagaimana cara mengurai file XML menggunakan python? Kecerdasan Data PlatoBlockchain. Pencarian Vertikal. Ai.

Besar! Kami ingin membaca data yang disimpan di bidang ini, mencari, memperbarui, dan membuat perubahan sesuai kebutuhan untuk situs web, bukan? Ini disebut penguraian, di mana data XML dibagi menjadi beberapa bagian dan bagian yang berbeda diidentifikasi.

Ada beberapa cara untuk mem-parsing file XML dengan python dengan pustaka yang berbeda. Mari selami metode pertama!


Coba Nanonets untuk mengurai file XML. Mulai uji coba gratis Anda tanpa detail kartu kredit.


Menggunakan Mini DOM untuk mengurai file XML

Saya yakin Anda akan menemui DOM (Document Object Model), API standar untuk merepresentasikan file XML. Mini DOM adalah modul python bawaan yang mengimplementasikan DOM secara minimal.  

Bagaimana cara kerja mini DOM?

Itu memuat file input XML ke dalam memori, membuat struktur seperti pohon "Pohon DOM" untuk menyimpan elemen, atribut, dan konten teks. Karena file XML juga secara inheren memiliki struktur pohon hierarkis, metode ini nyaman untuk dinavigasi dan mengambil informasi.

Mari kita lihat cara mengimpor paket dengan kode di bawah ini. Anda dapat mengurai file XML menggunakan xml.dom.minidom.parse() fungsi dan juga mendapatkan elemen root.

import xml.dom.minidom
# parse the XML file
xml_doc = xml.dom.minidom.parse('travel_pckgs.xml')
# get the root element
root = xml_doc.documentElement
print('Root is',root)

Output yang saya dapatkan untuk kode di atas adalah:

>> Root is <DOM Element: travelPackages at 0x7f05824a0280>

Katakanlah saya ingin mencetak tempat, durasi, dan harga setiap paket.  

Grafik dapatkanAtribut() fungsi dapat digunakan untuk mengambil nilai atribut elemen.

Jika Anda ingin mengakses semua elemen di bawah tag tertentu, gunakan dapatkanElementsByTagName()  metode dan berikan tag sebagai input. Bagian terbaiknya adalah getElementsByTagName() dapat digunakan secara rekursif, untuk mengekstrak elemen bersarang.

# get all the package elements
packages = xml_doc.getElementsByTagName('package')
# loop through the packages and extract the data
for package in packages:
package_id = package.getAttribute('id')
description = package.getElementsByTagName('description')[0].childNodes[0].data
price = package.getElementsByTagName('price')[0].childNodes[0].data
duration = package.getElementsByTagName('duration')[0].childNodes[0].data
print('Package ID:', package_id)
print('Description:', description)
print('Price:', price)

Output dari kode di atas ditampilkan di sini, dengan ID, teks deskripsi, dan nilai harga dari setiap paket yang diekstraksi dan dicetak.

Package ID: Paris vacation
Description: Experience the magnificent beauty of Paris and the french culture.
Price: 3000
Package ID: Hawaii Adventure
Description: Embark on an exciting adventure in Hawaii beaches!
Price: 4000
Package ID: Italian Getaway
Description: Indulge in the beauty and charm of Italy and get an all-inclusive authentic Italian food tour!
Price: 2000
Package ID: Andaman Island Retreat
Description: Experience the beauty of Island beaches,inclusive scuba
diving and Night kayaking through mangroves.
Price: 800

Minidom parser juga memungkinkan kita melintasi pohon DOM dari satu elemen ke elemen induknya, elemen anak pertama, anak terakhir, dan seterusnya. Anda dapat mengakses anak pertama dari elemen menggunakan anak pertama atribut. Nama dan nilai simpul elemen anak yang diekstraksi juga dapat dicetak Nama simpul dan nilai simpul atribut seperti yang ditunjukkan di bawah ini.

# get the first package element
paris_package = xml_doc.getElementsByTagName('package')[0]
# get the first child of the package element
first_child = paris_package.firstChild
#print(first_child)
>>
<DOM Element: description at 0x7f2e4800d9d0>
Node Name: description
Node Value: None

Anda dapat memverifikasi bahwa 'deskripsi' adalah elemen anak pertama dari . Ada juga atribut yang disebut anakNode yang akan mengembalikan semua elemen anak yang ada di dalam node saat ini. Periksa contoh di bawah ini dan hasilnya.

child_elements=paris_package.childNodes
print(child_elements)
>>
[<DOM Element: description at 0x7f057938e940>, <DOM Element: destination at 0x7f057938e9d0>, <DOM Element: price at 0x7f057938ea60>, <DOM Element: duration at 0x7f057938eaf0>, <DOM Element: payment at 0x7f057938eb80>]

Mirip dengan ini, minidom menyediakan lebih banyak cara untuk melintasi seperti parentNode, lastChild nextSibling, dll. Anda dapat memeriksa semua fungsi perpustakaan yang tersedia di sini.

Namun, kelemahan utama dari metode ini adalah penggunaan memori yang mahal karena seluruh file dimuat ke dalam memori. Tidak praktis menggunakan minidom untuk file besar. 


Mengotomatiskan penguraian XML Nanonet. Mulai uji coba gratis Anda hari ini. Tidak diperlukan kartu kredit.


Menggunakan Perpustakaan ElementTree untuk mem-parsing file XML

ElementTree adalah parser python bawaan yang banyak digunakan yang menyediakan banyak fungsi untuk membaca, memanipulasi, dan memodifikasi file XML. Parser ini membuat struktur seperti pohon untuk menyimpan data dalam format hierarkis.

Mari kita mulai dengan mengimpor pustaka dan memanggil fungsi parse() file XML kita. Anda juga dapat memberikan file masukan dalam format string dan menggunakan dari string() fungsi. Setelah kita menginisialisasi pohon parsing, kita dapat menggunakan dapatkan akar () berfungsi untuk mengambil tag root seperti yang ditunjukkan di bawah ini.

import xml.etree.ElementTree as ET
tree = ET.parse('travel_pckgs.xml')
#calling the root element
root = tree.getroot()
print("Root is",root)
Output:
>>
Root is <Element 'travelPackages' at 0x7f93531eaa40>

Tag root 'travelPackages' diekstraksi!

Katakanlah sekarang kita ingin mengakses semua tag anak pertama dari akar. Kita dapat menggunakan perulangan for sederhana dan mengulanginya, mencetak tag anak seperti tujuan, harga, dll...Perhatikan bahwa jika kita telah menentukan nilai atribut di dalam tag pembuka deskripsi, tanda kurung tidak akan kosong. Lihat cuplikan di bawah ini!

for x in root[0]:
print(x.tag, x.attrib)
Output:
>>
description {}
destination {}
price {}
duration {}
payment {}

Atau, yang iter () fungsi dapat membantu Anda menemukan elemen apa pun yang menarik di seluruh pohon. Mari gunakan ini untuk mengekstrak deskripsi setiap paket wisata di file kita. Ingatlah untuk menggunakan 'teks' atribut untuk mengekstrak teks dari suatu elemen.

For x in root.iter('description'):
print(x.text)
Output:
>> "Experience the magnificent beauty of Paris and the french culture." "Embark on an exciting adventure in Hawaii beaches!" "Indulge in the beauty and charm of Italy and get an all-inclusive authentic Italian food tour!" "Experience the beauty of Island beaches,inclusive scuba diving and Night kayaking through mangroves.

Saat menggunakan ElementTree, loop for dasar cukup kuat untuk mengakses elemen anak. Mari kita lihat caranya.

Mem-parsing file XML dengan loop for

Anda cukup melakukan iterasi melalui elemen turunan dengan perulangan for, mengekstraksi atribut seperti yang ditunjukkan di bawah ini.

for tour in root:
print(tour.attrib)
Output:
>>
{'id': 'Paris vacation'}
{'id': 'Hawaii Adventure'}
{'id': 'Italian Getaway'}
{'id': 'Andaman Island Retreat'}

Untuk menangani kueri dan pemfilteran yang kompleks, ElementTee memiliki Temukan semua() metode. Metode ini memungkinkan Anda mengakses semua elemen turunan dari tag yang diteruskan sebagai parameter. Katakanlah Anda ingin mengetahui paket tur yang harganya di bawah $4000, dan juga memiliki opsi EMI sebagai 'ya'. Periksa cuplikannya.

for package in root.findall('package'):
price = int(package.find('price').text)
refund = package.find('payment/refund').text.strip("'")
if price < 4000 and refund == 'yes':
print(package.attrib['id'])

Kami pada dasarnya mengulangi paket melalui root.findall('package') dan kemudian mengekstrak harga dan mengembalikannya Temukan() metode. Setelah ini, kami memeriksa kendala dan memfilter paket yang memenuhi syarat yang dicetak di bawah ini.

Keluaran:

>>

Liburan Paris

Retret Pulau Andaman

Menggunakan ElementTree, Anda dapat dengan mudah memodifikasi dan memperbarui elemen dan nilai file XML, tidak seperti miniDOM dan SAX. Mari kita periksa caranya di bagian selanjutnya.

Bagaimana cara memodifikasi file XML dengan ElementTree?

Katakanlah ini adalah waktu liburan Natal dan agensi ingin menggandakan biaya paket. ElementTree menyediakan a mengatur() fungsi, yang dapat kita gunakan untuk memperbarui nilai-nilai unsur. Pada kode di bawah ini, saya telah mengakses harga setiap paket melalui fungsi iter() dan memanipulasi harga. Anda dapat menggunakan fungsi write() untuk menulis file XML baru dengan elemen yang diperbarui.

for price in root.iter('price'):
new_price = int(price.text)*2
price.text = str(new_price)
price.set('updated', 'yes')
tree.write('christmas_packages.xml')

Anda harus dapat menemukan file output seperti yang ada di gambar di bawah ini. Jika Anda ingat, harga Paris Vacation dan Hawaii Adventure adalah $3000 dan $4000 di file aslinya.

Bagaimana cara mengurai file XML menggunakan python? Kecerdasan Data PlatoBlockchain. Pencarian Vertikal. Ai.

Tapi, bagaimana jika kita ingin menambahkan tag baru ke paket Andaman untuk menunjukkan bahwa masa inap yang ditawarkan adalah 'Vila pribadi premium'. Itu SubElemen() fungsi ElementTree memungkinkan kita menambahkan subtag baru sesuai kebutuhan, seperti yang ditunjukkan dalam cuplikan di bawah ini. Anda harus meneruskan elemen yang ingin Anda ubah dan tag baru sebagai parameter ke fungsi.

ET.SubElement(root[3], 'stay')
for x in root.iter('stay'):
resort = 'Premium Private Villa'
x.text = str(resort)
Bagaimana cara mengurai file XML menggunakan python? Kecerdasan Data PlatoBlockchain. Pencarian Vertikal. Ai.

Semoga Anda juga mendapatkan hasilnya! Paket juga menyediakan pop () fungsi, di mana Anda dapat menghapus atribut dan subelemen jika tidak diperlukan.


API sederhana untuk XML (SAX)

SAX adalah parser python lain, yang mengatasi kekurangan miniDOM dengan membaca dokumen secara berurutan. Itu tidak memuat seluruh pohon ke dalam memorinya, dan juga memungkinkan Anda membuang item, mengurangi penggunaan memori.

Pertama, mari kita membuat objek parser SAX dan mendaftarkan fungsi panggilan balik untuk berbagai kejadian yang ingin Anda tangani dalam dokumen XML. Untuk melakukan ini, saya mendefinisikan kelas TravelPackageHandler khusus seperti yang ditunjukkan di bawah ini dengan mensubklasifikasikan ContentHandler SAX.

import xml.sax
# Define a custom SAX ContentHandler class to handle events
class TravelPackageHandler(xml.sax.ContentHandler):
def __init__(self):
self.packages = []
self.current_package = {}
self.current_element = ""
self.current_payment = {} def startElement(self, name, attrs):
self.current_element = name
if name == "package":
self.current_package = {"id": attrs.getValue("id")} def characters(self, content):
if self.current_element in ["description", "destination", "price", "duration", "EMIoption", "refund"]:
self.current_package[self.current_element] = content.strip()
if self.current_element == "payment":
self.current_payment = {} def endElement(self, name):
if name == "package":
self.current_package["payment"] = self.current_payment
self.packages.append(self.current_package)
if name == "payment":
self.current_package["payment"] = self.current_payment def startElementNS(self, name, qname, attrs):
pass def endElementNS(self, name, qname):
pass

Dalam cuplikan di atas, file startElement(), karakter(), dan elemenakhir() metode digunakan untuk mengekstrak data dari elemen dan atribut XML. Saat parser SAX membaca dokumen, itu memicu fungsi panggilan balik terdaftar untuk setiap peristiwa yang ditemuinya. Misalnya, jika menemukan awal elemen baru, fungsi startElement() akan dipanggil. Sekarang, mari gunakan penangan khusus kita untuk mendapatkan berbagai ID paket yang mem-parsing file XML contoh kita.

# Create a SAX parser object
parser = xml.sax.make_parser()
handler = TravelPackageHandler()
parser.setContentHandler(handler)
parser.parse("travel_pckgs.xml")
for package in handler.packages:
print(f'Package: {package["id"]}')

Keluaran >>

Paket: liburan Paris

Paket: Petualangan Hawaii

Paket: Liburan Italia

Paket: Retret Pulau Andaman

SAX dapat digunakan untuk file besar dan streaming karena efisiensinya. Tapi, itu merepotkan saat bekerja dengan elemen bersarang dalam. Bagaimana jika Anda ingin mengakses node pohon acak? Karena tidak mendukung akses acak, parser harus membaca seluruh dokumen secara berurutan untuk mengakses elemen tertentu.


Sinkronkan semua entri ganda Anda dengan Nanonets. Jaga agar semua akun Anda seimbang, 24×7. Siapkan proses akuntansi Anda dalam <15 menit. Lihat bagaimana.


Streaming Pull Parser untuk XML

Ini adalah tarikan Pustaka Python yang menyediakan streaming pull parser API dengan antarmuka mirip DOM.

Bagaimana cara kerjanya?

Ini memproses data XML dengan cara "menarik". Artinya, Anda secara eksplisit meminta parser untuk menyediakan acara berikutnya (mis., elemen awal, elemen akhir, teks, dll.) dalam data XML.

Sintaksnya akrab dengan apa yang telah kita lihat di perpustakaan sebelumnya. Dalam kode di bawah ini, saya mendemonstrasikan cara mengimpor perpustakaan dan menggunakannya untuk mencetak tur yang berdurasi 4 hari atau lebih, dan juga memberikan pengembalian uang untuk pembatalan.

from xml.dom.pulldom import parse
events = parse("travel_pckgs.xml")
for event, node in events:
if event == pulldom.START_ELEMENT and node.tagName == 'package':
duration = int(node.getElementsByTagName('duration')[0].firstChild.data)
refund = node.getElementsByTagName('refund')[0].firstChild.data.strip("'")
if duration > 4 and refund == 'yes':
print(f"Package: {node.getAttribute('id')}")
print(f"Duration: {duration}")
print(f"Refund: {refund}")

Anda harus mendapatkan output seperti:

Paket: liburan Paris

Durasi: 7

Pengembalian dana: ya

Paket: Retret Pulau Andaman

Durasi: 8

Pengembalian dana: ya

Periksa hasilnya! Pull parser menggabungkan beberapa fitur dari miniDOM dan SAX, menjadikannya relatif efisien.

Kesimpulan

Saya yakin Anda sudah memahami berbagai parser yang tersedia di python sekarang. Mengetahui kapan harus memilih parser mana yang menghemat waktu dan sumber daya sama pentingnya. Di antara semua parser yang kami lihat, ElementTree menyediakan kompatibilitas maksimum dengan ekspresi XPath yang membantu menjalankan kueri kompleks. Minidom memiliki antarmuka yang mudah digunakan dan dapat dipilih untuk menangani file kecil, tetapi terlalu lambat untuk file besar. Pada saat yang sama, SAX digunakan dalam situasi di mana file XML terus diperbarui, seperti dalam kasus pembelajaran Mesin waktu nyata.

Salah satu alternatif untuk mengurai file Anda menggunakan alat penguraian otomatis seperti Nanonets. Nanonets dapat membantu Anda mengekstrak data dari dokumen apa pun dalam hitungan detik tanpa menulis satu baris kode pun.

Omengoptimalkan kinerja bisnis Anda, menghemat biaya, dan mendorong pertumbuhan. Temukan bagaimana kasus penggunaan Nanonet dapat diterapkan pada produk Anda.


Stempel Waktu:

Lebih dari AI & Pembelajaran Mesin