Penghuraian XML Python



Apakah itu XML?

XML merujuk kepada Bahasa Penanda Boleh Diperluas (eXtegang Markup Lbahasa). Anda boleh mempelajari tutorial XML melalui tapak ini

XML direka untuk menghantar dan menyimpan data.

XML ialah satu set peraturan yang mentakrifkan penanda semantik yang membahagikan dokumen kepada komponen dan mengenal pasti komponen tersebut.

Ia juga merupakan bahasa meta-markup, iaitu, ia mentakrifkan bahasa sintaksis untuk mentakrifkan bahasa penanda semantik dan berstruktur lain yang berkaitan dengan medan tertentu.


Penghuraian XML oleh Python

Antara muka pengaturcaraan XML biasa termasuk DOM dan SAX kedua-dua antara muka ini memproses fail XML dengan cara yang berbeza, dan sudah tentu senario penggunaannya juga berbeza.

Python mempunyai tiga kaedah untuk menghuraikan XML, SAX, DOM dan ElementTree:

1.SAX (API mudah untuk XML)

Pustaka standard Python mengandungi penghurai SAX, SAX Menggunakan model dipacu peristiwa, fail XML diproses dengan mencetuskan peristiwa satu demi satu dan memanggil fungsi panggil balik yang ditentukan pengguna semasa proses menghuraikan XML.

2.DOM (Model Objek Dokumen)

Menghuraikan data XML ke dalam pepohon dalam ingatan dan mengendalikan XML dengan beroperasi pada pepohon.

3.ElementTree (Pokok Elemen)

ElementTree adalah seperti DOM ringan dengan API yang mudah dan mesra. Kod ini mempunyai kebolehgunaan yang baik, pantas dan menggunakan kurang memori.

Nota: Oleh kerana DOM perlu memetakan data XML ke pepohon dalam ingatan, pertama, ia agak perlahan, dan kedua, ia menggunakan lebih banyak memori, manakala penstriman SAX membaca fail XML, yang adalah lebih pantas. Ia menggunakan lebih sedikit memori, tetapi memerlukan pengguna untuk melaksanakan fungsi panggil balik (pengendali).

Kandungan fail contoh XML movies.xml yang digunakan dalam bab ini adalah seperti berikut:

<collection shelf="New Arrivals">
<movie title="Enemy Behind">
   <type>War, Thriller</type>
   <format>DVD</format>
   <year>2003</year>
   <rating>PG</rating>
   <stars>10</stars>
   <description>Talk about a US-Japan war</description>
</movie>
<movie title="Transformers">
   <type>Anime, Science Fiction</type>
   <format>DVD</format>
   <year>1989</year>
   <rating>R</rating>
   <stars>8</stars>
   <description>A schientific fiction</description>
</movie>
   <movie title="Trigun">
   <type>Anime, Action</type>
   <format>DVD</format>
   <episodes>4</episodes>
   <rating>PG</rating>
   <stars>10</stars>
   <description>Vash the Stampede!</description>
</movie>
<movie title="Ishtar">
   <type>Comedy</type>
   <format>VHS</format>
   <rating>PG</rating>
   <stars>2</stars>
   <description>Viewable boredom</description>
</movie>
</collection>

python menggunakan SAX untuk menghuraikan xml

SAX ialah acara API yang dipacu.

Menggunakan SAX untuk menghuraikan dokumen XML melibatkan dua bahagian: penghurai dan pengendali acara.

Penghuraikan bertanggungjawab untuk membaca dokumen XML dan menghantar acara kepada pemproses acara, seperti acara permulaan dan penamat elemen

Pemproses acara bertanggungjawab untuk bertindak balas kepada acara dan lulus data XML diproses.

<psax sesuai untuk menangani masalah berikut: < p="">
  • 1 2. Hanya sebahagian daripada kandungan fail diperlukan, atau hanya maklumat khusus diperlukan daripada fail.

  • 3. Apabila anda ingin membina model objek anda sendiri.

  • Untuk menggunakan sax untuk memproses xml dalam python, anda mesti memperkenalkan fungsi parse dalam xml.sax dan ContentHandler dalam xml.sax.handler terlebih dahulu.

  • Pengenalan kaedah kelas ContentHandler

kaedah aksara(kandungan)

Masa panggilan: Mulakan dari talian, sebelum menemui label , terdapat aksara, dan nilai kandungan adalah rentetan ini.

Dari satu teg, terdapat aksara sebelum menemui teg seterusnya, dan nilai kandungan ialah rentetan ini.

Daripada teg, terdapat aksara sebelum menemui penamat baris, dan nilai kandungan ialah rentetan ini. Teg

boleh menjadi teg permulaan atau teg akhir.

kaedah startDocument()

dipanggil apabila dokumen dimulakan.

kaedah endDocument()

Dipanggil apabila penghurai sampai ke penghujung dokumen.

kaedah startElement(name, attrs)

dipanggil apabila teg permulaan XML ditemui ialah nama teg dan attrs ialah kamus nilai atribut daripada tag.

kaedah endElement(name)

dipanggil apabila teg hujung XML ditemui.


kaedah make_parser

Kaedah berikut mencipta objek parser baharu dan mengembalikannya.

xml.sax.make_parser( [parser_list] )

Perihalan parameter:

  • senarai_penghuraikan - Parameter pilihan, senarai penghurai


kaedah penghurai

Kaedah berikut mencipta penghurai SAX dan menghuraikan dokumen xml: parameter

rreee

Penerangan:

  • xmlfile - xml nama fail

  • contenthandler - Mestilah objek ContentHandler

  • errorhandler - Jika parameter ini ditentukan, errorhandler mestilah objek SAX ErrorHandler


kaedah parseString

kaedah parseString mencipta penghurai XML dan menghuraikan rentetan xml:

xml.sax.parse( xmlfile, contenthandler[, errorhandler])

Penerangan parameter:

  • xmlstring - rentetan xml

  • contenthandler - Mestilah objek ContentHandler

  • errorhandler - Jika parameter ini ditentukan, errorhandler mestilah objek SAX ErrorHandler


Python parsing XML instance

xml.sax.parseString(xmlstring, contenthandler[, errorhandler])

Hasil pelaksanaan kod di atas adalah seperti berikut:

#!/usr/bin/python
# -*- coding: UTF-8 -*-

import xml.sax

class MovieHandler( xml.sax.ContentHandler ):
   def __init__(self):
      self.CurrentData = ""
      self.type = ""
      self.format = ""
      self.year = ""
      self.rating = ""
      self.stars = ""
      self.description = ""

   # 元素开始事件处理
   def startElement(self, tag, attributes):
      self.CurrentData = tag
      if tag == "movie":
         print "*****Movie*****"
         title = attributes["title"]
         print "Title:", title

   # 元素结束事件处理
   def endElement(self, tag):
      if self.CurrentData == "type":
         print "Type:", self.type
      elif self.CurrentData == "format":
         print "Format:", self.format
      elif self.CurrentData == "year":
         print "Year:", self.year
      elif self.CurrentData == "rating":
         print "Rating:", self.rating
      elif self.CurrentData == "stars":
         print "Stars:", self.stars
      elif self.CurrentData == "description":
         print "Description:", self.description
      self.CurrentData = ""

   # 内容事件处理
   def characters(self, content):
      if self.CurrentData == "type":
         self.type = content
      elif self.CurrentData == "format":
         self.format = content
      elif self.CurrentData == "year":
         self.year = content
      elif self.CurrentData == "rating":
         self.rating = content
      elif self.CurrentData == "stars":
         self.stars = content
      elif self.CurrentData == "description":
         self.description = content
  
if ( __name__ == "__main__"):
   
   # 创建一个 XMLReader
   parser = xml.sax.make_parser()
   # turn off namepsaces
   parser.setFeature(xml.sax.handler.feature_namespaces, 0)

   # 重写 ContextHandler
   Handler = MovieHandler()
   parser.setContentHandler( Handler )
   
   parser.parse("movies.xml")

Untuk dokumentasi API SAX yang lengkap, sila rujuk API Python SAX


Gunakan xml.dom untuk menghuraikan xml

Model Objek Dokumen (DOM), iaitu pemprosesan yang disyorkan oleh organisasi W3C Antara muka pengaturcaraan standard untuk bahasa penanda boleh diperluaskan.

Apabila penghurai DOM menghuraikan dokumen XML, ia membaca keseluruhan dokumen sekaligus dan menyimpan semua elemen dalam dokumen dalam struktur pepohon dalam ingatan Selepas itu, anda boleh menggunakan fungsi berbeza yang disediakan oleh DOM . Untuk membaca atau mengubah suai kandungan dan struktur dokumen, anda juga boleh menulis kandungan yang diubah suai ke dalam fail xml.

xml.dom.minidom digunakan untuk menghuraikan fail xml dalam python Contohnya adalah seperti berikut:

*****Movie*****
Title: Enemy Behind
Type: War, Thriller
Format: DVD
Year: 2003
Rating: PG
Stars: 10
Description: Talk about a US-Japan war
*****Movie*****
Title: Transformers
Type: Anime, Science Fiction
Format: DVD
Year: 1989
Rating: R
Stars: 8
Description: A schientific fiction
*****Movie*****
Title: Trigun
Type: Anime, Action
Format: DVD
Rating: PG
Stars: 10
Description: Vash the Stampede!
*****Movie*****
Title: Ishtar
Type: Comedy
Format: VHS
Rating: PG
Stars: 2
Description: Viewable boredom

Hasil pelaksanaan program di atas adalah seperti berikut:

#!/usr/bin/python
# -*- coding: UTF-8 -*-

from xml.dom.minidom import parse
import xml.dom.minidom

# 使用minidom解析器打开 XML 文档
DOMTree = xml.dom.minidom.parse("movies.xml")
collection = DOMTree.documentElement
if collection.hasAttribute("shelf"):
   print "Root element : %s" % collection.getAttribute("shelf")

# 在集合中获取所有电影
movies = collection.getElementsByTagName("movie")

# 打印每部电影的详细信息
for movie in movies:
   print "*****Movie*****"
   if movie.hasAttribute("title"):
      print "Title: %s" % movie.getAttribute("title")

   type = movie.getElementsByTagName('type')[0]
   print "Type: %s" % type.childNodes[0].data
   format = movie.getElementsByTagName('format')[0]
   print "Format: %s" % format.childNodes[0].data
   rating = movie.getElementsByTagName('rating')[0]
   print "Rating: %s" % rating.childNodes[0].data
   description = movie.getElementsByTagName('description')[0]
   print "Description: %s" % description.childNodes[0].data
<🎜. >Untuk dokumentasi API DOM yang lengkap, sila rujuk API DOM Python.