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. Әрине деректер форматы, тіпті мәтінде негізделген ойдағыдан көп, алайда ұсынылған мәліметтер, форматты өңдеу үшін немесе басқалары түсінетіндей өз модулін құрастыруын кез келген модулмен тез ұғынуға көмектеседі.

Наши рекомендации