پردازش و تفسیر فایل های XML با استفاده از توابع DOM
موسسه پایاپروژه به عنوان متصدی انجام پروژه های پایتون وظیفه ی خود می داند که در راستای آموزش نرم افزار پایتون گام های موثری را بردارد. با توجه به اینکه یک دوره آموزشی پایتون مستلزم تمرین و تلاش بسیار است. اما این موسسه تلاش می کند سهم کوچکی در جهت یادگیری پردازش و تفسیر فایل های داده داشته باشد.
Document Object Model (DOM) یک رابط برنامه نویسی برای اسناد HTML و XML است. که این توابع ساختار منطقی اسناد و نحوه دسترسی و دستکاری یک سند را تعریف می کند.
این مقاله بر چگونگی تجزیه و تحلیل یک فایل XML داده شده و استخراج برخی از داده های مفید از آن به روشی ساختاریافته تمرکز دارد.

XML چیست؟
XML: XML مخفف عبارت Extensible Markup Language است. برای ذخیره و انتقال داده هایی طراحی شده که هم برای انسان و هم توسط ماشین قابل خواندن باشد. به همین دلیل، اهداف طراحی XML بر سادگی، عمومیت و قابلیت استفاده در سراسر اینترنت تاکید دارد.
فایل XML می تواند مثلا یک فید RSS باشد.
RSS، اغلب به نام Really Simple Syndicationاز خانواده ای از قالب های فید وب استاندارد برای انتشار اطلاعات به روز شده مکرر مانند ورودی های وبلاگ، سرفصل های اخبار، صدا، ویدئو استفاده می کند. RSS یک متن ساده با فرمت XML است.
ماژول xml.dom
ماژول Python مورد استفاده در این مقاله xml.dom نام دارد و بر روی استفاده از ماژول xml داخلی در پایتون برای تجزیه XML تمرکز دارد و تمرکز اصلی بر روی ElementTree XML API این ماژول خواهد بود.
مثال1:
usr/bin/python/!#
from xml.dom.minidom import parse
import xml.dom.minidom
Open XML document using minidom parser#
DOMTree = xml.dom.minidom.parse(“movies.xml”)
collection = DOMTree.documentElement
:if collection.hasAttribute(“shelf”)
print “Root element : %s” % collection.getAttribute(“shelf”)
Get all the movies in the collection#
movies = collection.getElementsByTagName(“movie”)
. Print detail of each 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
پردازش XML با ای پی آی های DOM:
مثال2: پردازش XML با ای پی آی های DOM در پایتون ساده است. برای مثال، ما یک نمونه سند XML (sample.xml) به شکل زیر ایجاد کردیم:
<?”xml version=”1.0?>
<company>
<name>GeeksForGeeks Company</name>
<“staff id=”1>
<name>Amar Pandey</name>
<salary>8.5 LPA</salary>
<staff/>
<“staff id=”2>
<name>Akbhar Khan</name>
<salary>6.5 LPA</salary>
<staff/>
<“staff id=”3>
<name>Anthony Walter</name>
<salary>3.2 LPA</salary>
<staff/>
<company/>
حالا XML بالا را با پایتون پردازش و تجزیه می کنیم، که روند آن به صورت زیر خواهد بود
from xml.dom import minidom
doc = minidom.parse(“sample.xml”)
doc.getElementsByTagName returns the NodeList#
name = doc.getElementsByTagName(“name”)[0]
print(name.firstChild.data)
staffs = doc.getElementsByTagName(“staff”)
:for staff in staffs
staff_id = staff.getAttribute(“id”)
name = staff.getElementsByTagName(“name”)[0]
salary = staff.getElementsByTagName(“salary”)[0]
% “print(“id:% s, name:% s, salary:% s
((staff_id, name.firstChild.data, salary.firstChild.data)
خروجی:
GeeksForGeeks Company
id:1, name: Amar Pandey, salary:8.5 LPA
id:2, name: Akbar Khan, salary:6.5 LPA
id:3, name: Anthony Walter, salary:3.2 LPA
پردازش XML با استفاده از تابع تعریف شده:
مثال 3: همین کار را می توان با استفاده از یک تابع تعریف شده توسط کاربر همانطور که در کد زیر نشان داده شده است انجام داد:
from xml.dom import minidom
doc = minidom.parse(“sample.xml”)
user-defined function#
:def getNodeText(node)
nodelist = node.childNodes
[] =result
:for node in nodelist
:if node.nodeType == node.TEXT_NODE
result.append(node.data)
return ”.join(result)
name = doc.getElementsByTagName(“name”)[0]
print(“Company Name : % s \n” % getNodeText(name))
staffs = doc.getElementsByTagName(“staff”)
:for staff in staffs
staff_id = staff.getAttribute(“id”)
name = staff.getElementsByTagName(“name”)[0]
salary = staff.getElementsByTagName(“salary”)[0]
% ” print(“id:% s, name:% s, salary:% s
(staff_id, getNodeText(name), getNodeText(salary)))
خروجی:
Company Name : GeeksForGeeks Company
id:1, name:Amar Pandey, salary:8.5 LPA
id:2, name:Akbhar Khan, salary:6.5 LPA
id:3, name:Anthony Walter, salary:3.2 LPA
