Latest web development tutorials

งูหลามวิเคราะห์ XML

XML คืออะไร?

XML หมายความ Extensible Markup Language(E X tensible M arkup L anguage) คุณสามารถเรียนรู้ผ่านทางเว็บไซต์นี้ XML สอน

XML ถูกออกแบบมาเพื่อส่งและเก็บข้อมูล

XML เป็นชุดของกฎในการกำหนดความหมายของแท็กแท็กเหล่านี้จะเอกสารแบ่งออกเป็นหลายส่วนและชิ้นส่วนเหล่านี้จะระบุ

นอกจากนี้ยังเป็นภาษาอภิมาร์กอัปที่กำหนดไวยากรณ์ของภาษาที่ใช้ในการกำหนดความหมายของภาษามาร์กอัปอื่น ๆ เฉพาะโดเมนโครงสร้าง


หลามสำหรับการแยก XML

DOM สามัญและ XML อินเตอร์เฟซการเขียนโปรแกรมแซ็กโซโฟนสองอินเตอร์เฟซที่แตกต่างกับไฟล์ XML วิธีการของหลักสูตรการใช้โอกาสที่แตกต่างกัน

มีสามวิธีคืองูหลามวิเคราะห์ XML, แซ็กโซโฟน, DOM และ ElementTree:

1.SAX (แซกซ์)

มาตรฐานห้องสมุดหลามมี parser แซ็กโซโฟนแซ็กโซโฟนที่มีรูปแบบเหตุการณ์ที่ขับเคลื่อนด้วยการเรียกโดยเหตุการณ์หนึ่งในกระบวนการของการวิเคราะห์ XML และเรียกผู้ใช้กำหนดฟังก์ชั่นการโทรกลับไปจัดการกับไฟล์ของ XML

2.DOM (Object Model เอกสาร)

ข้อมูล XML จะแยกเป็นต้นไม้ในหน่วยความจำในการดำเนินงานผ่านต้นไม้ที่จะจัดการกับ XML

3.ElementTree (ต้นไม้องค์ประกอบ)

ElementTree เป็นน้ำหนักเบา DOM ด้วย API ที่สะดวกสบายและเป็นกันเอง ความพร้อมใช้งานรหัสได้อย่างรวดเร็วและใช้หน่วยความจำน้อย

หมายเหตุ: เนื่องจาก DOM ต้อง map ข้อมูล XML เป็นต้นไม้หน่วยความจำช้าที่สองคือการบริโภคมากขึ้นของหน่วยความจำ SAX สตรีมมิ่งอ่านไฟล์ XML ได้เร็วขึ้น, ใช้หน่วยความจำน้อยลง แต่ต้องใช้เพื่อดำเนินการเรียกกลับ (จัดการ )

ใช้ส่วนนี้ไปยัง movies.xml เอกสาร XML เช่นอ่านดังนี้

<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>

หลาม XML แยกโดยใช้แซ็กโซโฟน

แซ็กโซโฟนเป็น API เหตุการณ์ที่ขับเคลื่อนด้วย

ใช้แยก SAX เอกสาร XML เกี่ยวข้องกับสองส่วนแยกวิเคราะห์และเหตุการณ์การจัดการ

ตัวแยกวิเคราะห์เป็นผู้รับผิดชอบสำหรับการอ่านเอกสาร XML และส่งเหตุการณ์จัดการเหตุการณ์เช่นองค์ประกอบเริ่มต้นด้วยเหตุการณ์สิ้นสุดองค์ประกอบ;

ตัวจัดการเหตุการณ์เป็นผู้รับผิดชอบต่อเหตุการณ์ที่เกิดขึ้นตามการถ่ายโอนข้อมูล XML สำหรับการประมวลผล

  • 1, การประมวลผลของไฟล์ที่มีขนาดใหญ่;
  • 2 เพียงส่วนหนึ่งของเนื้อหาของแฟ้มหรือเพียงเพื่อให้ได้ข้อมูลที่เฉพาะเจาะจงจากแฟ้ม
  • 3 ต้องการที่จะสร้างรูปแบบวัตถุของตัวเองตลอดเวลา

แซ็กโซโฟนใช้ xml.sax ลักษณะ XML ครั้งแรกในฟังก์ชั่นแยก, เช่นเดียวกับ xml.sax.handler ContentHandler ในหลาม

วิธีการเรียน ContentHandler แนะนำ

ตัวอักษร (Content) วิธีการ

ระยะเวลาของการโทร:

จากจุดเริ่มต้นของเส้นก่อนที่จะประสบฉลากมีค่าตัวเนื้อหาของสตริงเหล่านี้

จากป้ายฉลากก่อนที่จะเผชิญหน้าต่อไปการปรากฏตัวของตัวละครที่มีค่าเนื้อหาของสตริงเหล่านี้

จากฉลากก่อนที่จะเผชิญหน้ากับ Terminator สายการปรากฏตัวของตัวละครค่าเนื้อหาของสตริงเหล่านี้

แท็กอาจจะเป็นจุดเริ่มต้นของแท็กก็สามารถเป็นจุดสิ้นสุดของฉลาก

startDocument () วิธีการ

เริ่มต้นเอกสารที่เรียกว่า

endDocument () วิธีการ

เมื่อมีการโทรถึงจุดสิ้นสุดของตัวแยกวิเคราะห์เอกสาร

startElement (ชื่อ attrs) วิธีการ

เรียกแท็กเริ่มต้น XML พบชื่อเป็นชื่อของแท็ก, attrs เป็นแท็กมูลค่าทรัพย์สินพจนานุกรม

endElement (ชื่อ) วิธีการ

เรียกแท็กสิ้นสุดพบ XML


วิธี make_parser

วิธีการต่อไปนี้สร้างวัตถุ parser ใหม่และผลตอบแทน

xml.sax.make_parser( [parser_list] )

พารามิเตอร์คำอธิบาย:

  • parser_list - พารามิเตอร์ตัวเลือกรายการแยกวิเคราะห์

วิธีการแยกวิเคราะห์

วิธีการต่อไปนี้สร้าง parser แซ็กโซโฟนและแยกเอกสาร XML:

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

พารามิเตอร์คำอธิบาย:

  • XMLFile - ชื่อไฟล์ XML
  • ContentHandler - ต้องเป็นวัตถุของ ContentHandler ที่
  • ErrorHandler - ถ้าพารามิเตอร์นี้มีการระบุ ErrorHandler จะต้องเป็นวัตถุ SAX ErrorHandler

วิธี parseString

วิธี parseString สร้าง parser XML และแยกสตริง XML:

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

พารามิเตอร์คำอธิบาย:

  • xmlstring - สตริง XML
  • ContentHandler - ต้องเป็นวัตถุของ ContentHandler ที่
  • ErrorHandler - ถ้าพารามิเตอร์นี้มีการระบุ ErrorHandler จะต้องเป็นวัตถุ SAX ErrorHandler

เช่นงูหลาม XML แยก

#!/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")

รหัสข้างต้นจะถูกดำเนินการดังต่อไปนี้:

*****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

เอกสาร API แซ็กโซโฟนที่สมบูรณ์โปรดดูที่ หลาม SAX APIs


ใช้ xml.dom แจง XML

Document Object Model (Document Object Model เรียกว่า DOM) มันเป็น W3C แนะนำการรักษา Extensible Markup ภาษาอินเตอร์เฟซโปรแกรมมาตรฐาน

ในการแยกวิเคราะห์ DOM ที่จะแยกเอกสาร XML อ่านเอกสารทั้งหมดในครั้งเดียวองค์ประกอบทั้งหมดของเอกสารที่บันทึกไว้ในโครงสร้างในหน่วยความจำแล้วคุณสามารถใช้ DOM เพื่อให้การทำงานที่แตกต่างในการอ่านหรือแก้ไขเอกสาร เนื้อหาและโครงสร้างที่จะแก้ไขการเขียนเนื้อหาของไฟล์ XML ที่

หลามกับ xml.dom.minidom การแยกเอกสาร XML ตัวอย่างดังต่อไปนี้:

#!/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

ผลของวิธีการดังกล่าวข้างต้นมีดังนี้

Root element : New Arrivals
*****Movie*****
Title: Enemy Behind
Type: War, Thriller
Format: DVD
Rating: PG
Description: Talk about a US-Japan war
*****Movie*****
Title: Transformers
Type: Anime, Science Fiction
Format: DVD
Rating: R
Description: A schientific fiction
*****Movie*****
Title: Trigun
Type: Anime, Action
Format: DVD
Rating: PG
Description: Vash the Stampede!
*****Movie*****
Title: Ishtar
Type: Comedy
Format: VHS
Rating: PG
Description: Viewable boredom

เอกสาร API DOM สมบูรณ์โปรดดู งูหลาม DOM ทั้งหมด APIs