XML-жатты талдау

Дайын XML-жатымен жмыс істеу шін XML-анализаторын олдану ажет. Document класс обьектісіні рылуымен XML-жаты parse ( ) функциясы кмегімен тек бір жолда кездеседі. Ескере кететіні, стандартты xml пакетінен баса PyXML пакетін немесе баламалы коммерциялы пакетті оюа болады. Дегенмен растырушылар DOM Level 2 стандартымен шыан, бірегей API стануа тырысады.

import xml.dom.minidom

dom = xml.dom.minidom.parse("expression.xml")

 

dom.normalize()

 

def output_tree(node, level=0):

if node.nodeType == node.TEXT_NODE:

if node.nodeValue.strip():

print ". "*level, node.nodeValue.strip()

else: # ELEMENT_NODE или DOCUMENT_NODE

atts = node.attributes or {}

att_string = ", ".join(

["%s=%s " % (k, v) for k, v in atts.items()])

print ". "*level, node.nodeName, att_string

for child in node.childNodes:

output_tree(child, level+1)

 

output_tree(dom)

Бл мысалда ааш, аын кірісінде абылдайтын жне барлы енген аындар шін рекурсивті шаырылатын, наты output_tree() функциясы кмегімен шыарылады.

Нтижесі шамамен келесідей шыады:

#document

. expression

. . operation type=+

. . . operand

. . . . 2

. . . operand

. . . . operation type=*

. . . . . operand

. . . . . . 3

. . . . . operand

. . . . . . 4

Барлы мтіндік фрагменттер біріктірілуі шін, мнда normalize() дісі олданылады (йтпесе атарынан мтінмен берілген бірнеше тйіндерді келуі ммкін).

Тіпті шаын мысалдарда аындар атрибуттарын олдананын байауа болады: node.nodeType аын трін крсетеді, node.nodeValue мліметтерге олжетімділік шін олданылады, node.nodeName аын атын береді (тег атымен сйкес), node.attributes аын атрибуттарына олжетімділік береді. node.childNodes еншілес (дочерним узлам) аындара олжетімділік шін олданылады. Осы асиеттер аашты рекурсивті айналып ту шін жеткілікті.

Барлы аындар Node классыны ішкі класстарыны данасы болып табылады. Олар келесідей трде болуы ммкін:

Атауы Маынасы діс ру шін
ELEMENT_NODE Элемент createElement(tagname)
createElement(tagname) Атрибут createAttribute(name)
TEXT_NODE Мтіндік аын createTextNode(data)
CDATA_SECTION_NODE CDATA блімі  
ENTITY_REFERENCE_NODE Сілтеме мні  
ENTITY_NODE мні  
PROCESSING_INSTRUCTION_NODE Нсаулы бойынша деу createProcessingInstruction(target, data)
COMMENT_NODE Пікір createComment(comment)
DOCUMENT_NODE жат  
DOCUMENT_TYPE_NODE жат трі  
DOCUMENT_FRAGMENT_NODE жат фрагменті  
NOTATION_NODE Нотация  

 

Аындаы бірнеше ытимал трлердегі обьекттен тратын DOM жаты ааш болып табылады. Аындар атрибуттар немесе деректер болуы ммкін. Аындара олжетімділікті childNodes (еншілес тйіндері), firstChild (бірінші еншілес тйіндері), lastChild (соы еншілес тйіндері), (ата-ана), nextSibling (келесі аасы),previousSibling (алдыы аасы).parentNode атрибуттары арылы жзеге асыруа болады.

 

Жоарыда appendChild() дісі арылы айтылды. Оан insertBefore(newChild, refChild) (refChild-ге дейін newChild ою), removeChild(oldChild)

(еншілес тйіндерді шіру), replaceChild(newChild, oldChild) (заметить oldChild на newChild) дістерін осуа болады. Таыда аындарды клондайтын (егер deep=1 берілген болса, еншілес тйіндермен бірге), cloneNode(deep) дісі бар.

 

ELEMENT_NODE аын трі, аталандардан баса дістер "жай ана" торабыны кптеген баса дістеріне ие. Міне оларды ішіндегі негізгілері:

 

tagName

Элемент тріні аты.

 

getElementsByTagName(tagname)

Барлы берілген элементтеріні трлеріні арасынан tagname атымен крсетілген элементтерін алады.

 

getAttribute(attname)

attname атымен берілген атрибуттар мнін алады.

 

getAttributeNode(attrname)

Обьект-аын тріндегі attrname атымен берілген атрибутты айтарады.

 

removeAttribute(attname)

attname атымен берілген атрибутты шіреді.

 

removeAttributeNode(oldAttr)

oldAttr атрибутын шіру (обьект-аын трінде берілген)

 

setAttribute(attname, value)

value жолына те attname атрибутыны мнін белгілейді.

 

setAttributeNode(newAttr)

Элементке жаа аын-атрибут енгізеді. Егер сол ата ие болса, ескі атрибут ауыстырылады.

 

Бл жерде айта кету керек, атрибуттар элементті аясында айталанбауы тиіс. Оларды тртібі, сондай-а XML апаратты моделіні трысынан маызды емес.

 

Жаттыу ретінде XML-сынуында берілген рнекті мнін шыаратын функцияларды ру сынылады.

 

Атаулар кеістігі

XML-ді таы да бір ерекшелігі – атаулар кеістігі болып табылады. Олар ртрлі схемаларды кесектерінен XML-жаттарын рауа ммкіндік береді. Мысалы, осылайша, барлы HTML элементтеріні ерекше кеістік аттарына тиесілігін крсетіп, XML-жатна HTML кесегін осуа болады.

XML-кодыны келесі мысалы кеістік атауыны синтаксисін крсетеді (foaf.rdf файлы):

<?xml version="1.0" encoding="UTF-8"?>

<rdf:RDF

xmlns:dc="http://http://purl.org/dc/elements/1.1/"

xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"

xmlns:foaf="http://xmlns.com/foaf/0.1/"

xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"

>

<rdf:Description rdf:nodeID="_:jCBxPziO1">

<foaf:nick>donna</foaf:nick>

<foaf:name>Donna Fales</foaf:name>

<rdf:type rdf:resource="http://xmlns.com/foaf/0.1/Person"/>

</rdf:Description>

</rdf:RDF>

Ескерту:

Мысал WWW технолгогиясын жасаушыларымен, Тимом Бернерс-Ли бастауындаы растырушылар командасымен рылан cwm пакетінен алынан. Айтпашы, cwm-де Python тілімен жазылан. cwm пакеті, Тимом Бернерс-Ли-ді ыпалындаы, семантикалы желідегі-жаа идеялар шін жалпы масаттаы деректерді деуге ызмет етеді.

Кеістік аттарыны атауы префикстерді элементтерді атауы трінде жреді. Бл атаулар жай ана ат емес. Олар URI (Universal Resource Locator, мбебап ресурстарын крсетуші) трінде берілуі керек идентификаторымен сйкес. Жоарыда келтірілген мысалда бес кеістік атауы аталан (xmlns, dc, rdfs, foaf и rdf), оны ішінде тек біріншісі жарнамалау ажет етпейді, йткені ондырылан болып табылады. Жне наты трде шеуі ана олданылан: (xmlns, foaf жне rdf).

Кеістік аты XML-жатынан трлі схемалара жататын бліктерін блуге ммкіндік береді.

Xml пакетінде кеістік аттарыны механизімін тсінетін дістер бар. детте бндай дістер жне атрибуттар здеріні аттарында NS ріптері болады.

Осы элементті кеістік атымен сйкес келетін URI-ді namespaceURI атрибутыны кмегімен алуа болады.

Келесі мысалда URI элементтері жазылуда:

import xml.dom.minidom

dom = xml.dom.minidom.parse("ex.xml")

 

def output_ns(node):

if node.nodeType == node.ELEMENT_NODE:

print node.nodeName, node.namespaceURI

for child in node.childNodes:

output_ns(child)

output_ns(dom)

Нтижесінде:

rdf:RDF http://www.w3.org/1999/02/22-rdf-syntax-ns#

rdf:Description http://www.w3.org/1999/02/22-rdf-syntax-ns#

foaf:nick http://xmlns.com/foaf/0.1/

foaf:name http://xmlns.com/foaf/0.1/

rdf:type http://www.w3.org/1999/02/22-rdf-syntax-ns#

Ескеретіні, кеістік атауынны нсауы тек элементтер атауы шін ана емес, сонымен атар атрибуттарада жасалуы ммкін.

Орытынды

Бл дрісте ш жеткілікті таратылан мтіндік апараттарды деуді нсалары арастырылды: CSV, Unix mailbox жне XML. рине деректер форматы, тіпті мтінде негізделген ойдаыдан кп, алайда сынылан мліметтер, форматты деу шін немесе басалары тсінетіндей з модулін растыруын кез келген модулмен тез ынуа кмектеседі.