Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
104-155.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
122.82 Кб
Скачать

Тақырыпша өрісін талдау

Төменде келтірілген мысалда Subject өрісі email.Header.make_header() көмегімен қалыптасты. Өрісті талдау үшін басқа функция өткізуге көмектеседі: email.Header.decode_header (). Бұл функция тізім кортежін қайтарады, берілген мәтін бойынша, олардың әр қайсысында мәтін өрісінің бөлігі және кодтау көрсетілген. Келесі мысалда бұған түсініктеме келтірілген:

subj = """=?koi8-r?Q?=FC=D4=CF_=D0=D2=C9=CD=C5=D2_=CF=DE=C5=CE=D8_=C4=CC=C9?=

=?koi8-r?Q?=CE=CE=CF=C7=CF_=28164_bytes=29_=D0=CF=CC=D1_=D3_=D4?=

=?koi8-r?Q?=C5=CD=CF=CA_=D3=CF=CF=C2=DD=C5=CE=C9=D1=2E_=EF=CE=CF_?=

=?koi8-r?Q?=D2=C1=DA=C2=C9=CC=CF=D3=D8_=CE=C1_=CB=D5=D3=CB=C9_=D7?=

=?koi8-r?Q?_=D3=CF=CF=C2=DD=C5=CE=C9=C9=2C_=CE=CF_=CC=C5=C7=CB=CF?=

=?koi8-r?Q?_=D3=CF=C2=C9=D2=C1=C5=D4=D3=D1_=D7_=D4=C5=CB=D3=D4_?=

=?koi8-r?Q?=D3_=D0=CF=CD=CF=DD=D8=C0_email=2EHeader=2Edecode=5Fheader?=

=?koi8-r?Q?=28=29?="""

import email.Header

for text, enc in email.Header.decode_header(subj):

print enc, text

Нәтижесінде:

koi8-r Бұл хабарлама тақырыбымен берілген өте ұзын (164 bytes) өрістің мысалы. Ол хабарлама бөліктеріне бөлінген, бірақ email.Header.decode_header ( ) көмегімен мәтінге тез жинақталады.

Айта кететіні, көрсетпеседе болады:

>>> email.Header.decode_header("simple text")

[('simple text', None)]

>>> email.Header.decode_header("пример")

[('\xd0\xd2\xc9\xcd\xc5\xd2', None)]

>>>email.Header.decode_header("=?KOI8-R?Q?=D0=D2=CF_?=Linux")

[('\xd0\xd2\xcf ', 'koi8-r'), ('Linux', None)]

Егер бірінші жағдайда us-ascii тұспалдауға болатын болса, онда екінші жағдайда кодтау жайында аңғару керек болады: міне осыған байланысты электронды хатта жайдан жай сегіздік кодтауды қолдануға болмайды. Үшінші мысалда орысша әріптер кодталған, ал латынша – кодталмаған, сондықтан email.Header.decode_header() нәтижесінде екі жұп тізімі.

Жалпы жағдайда хабарлама өрісін тек Unicode-та ұсынуға болады. Осындай түрлендіру үшін функция құру жаттығу ретінде ұсынылады.

XML тілі

Бір дәрістің ішінде XML не екенін түсіндіру қиын және онымен қалай жұмыс істеу керек екені де. Мысалда стандартты жеткізілуіне кіретін xml пакеті қолданылады.

XML (Extensible Markup Language, Кеңейтілген Белгілеу Тілі) әр түрлі өндіруші қосымшаларының арасында өзара байланысын реттеуге, сақтауға және күрделі құрылымдық деректерді өңдеуге ұшыратуға мүмкіндік береді.

XML тілі (HTML сияқты) SGML-дің ішкі жиыны болып табылады, бірақ оның қолданылуы WWW жүйесімен шектелмеген. XML – де нақты тақырып шегі үшін өзінің тегтер жинағын құруға болады. XML – де мәліметтер қорын өңдеуді және білімді, обьекттер арасында өзара байланысты хаттамаларын, ресурстар сипаттамасын және т.б. сақтауға және таратуға болады.

Жаңа үйренушілерге әр кезде түсінікті емес: дәл сол мәліметтерді сақтау үшін өзіңнің компакті форматын құруға болатын болса, неге осындай жеткілікті көпсөзді форматты мейілінше қолдану керек. XML ерекшелігі, ол мәліметтер мен қоса контекстік ақпаратты сақтайды: тегтер және олардың атрибуттарының аттары болады. Сондай-ақ, XML бүгінде – біріңғай ортақ стандарт.

XML – құжаттары ресми-дұрыс (well-formed) және жарамды (valid) болады. Жарамды XML – құжат – бұл құжат түрін жарнамалау (DTD, Document Type Definition) тұратын ресми-дұрыс XML – құжаты. Құжат түрін жарнамалау XML-дегі мәтін құжаты қанағаттандыратын грамматика ұсынады. Баяндаманың қарапайымдылығы үшін мұнда DTD қарастырылмайды, мүмкіндігінше ресми-дұрыс құжатымен шектеледі.

Әріптер мен басқа да XML таңбаларын ұсыну үшін Unicode пайдаланады, ол әртүрлі әліпбилердің таңбаларын ұсына отырып мәселелерді қысқартады. Дегенмен бұл жағдайды есте сақтау керек және XML-де сегіздік кодтауды қолданбау керек.

Келесі XML-құжатының жеткілікті қарапайым мысалы бұл формат жайлы көрініс береді (expression.xml файлы):

<?xml version="1.0" encoding="iso-8859-1"?>

<expression>

<operation type="+">

<operand>2</operand>

<operand>

<operation type="*">

<operand>3</operand>

<operand>4</operand>

</operation>

</operand>

</operation>

</expression>

XML-құжаты әр кезде ағаш құрылымына ие, түбірінде өзі құжат. Оның бөліктері, салынған тегтер жұбымен сипатталған, тарамдар қалыптастырады. Осылайша, ағаш қабырғасы “тікелей тіркеме” білдіреді. Тег атрибуттарын жапырақтары деп санауға болады. Сонда шығатыны құжат ағаш құрылымына ие.

Ескерту:

Ескере кететіні, HTML-ден ерекшелігі, XML-де жалғыз (жұп емес) тегтер қиғаш сызықпен: <BR/>, ал атрибуттар – тырнақшаға алынып жазылады. XML-де тегтер атауындағы және атрибуттағы әріптер регистрі мәнге ие.

XML-құжатын қалыптастыру

Тұжырым бойынша XML-құжатын өңдеудің екі жолы бар: кезекті өңдеу және құжаттың обьектілік моделімен жұмыс.

Бірінші жағдайда SAX (Simple API for XML, XML үшін қарапайым бағдарламалық интерфейс) қолданылады. SAX жұмысы мәліметтер көздерін(input source) XML-анализаторларымен (XML-reader) оқу және өңдеуші-обьектілерімен (handlers) өңделетін кезекті оқиғалардың (events) буындары болып табылады. SAX XML-құжатына кезекті қолжетімділік береді.

Екінші жағдайда XML-құжатына нақты обьектілік модельді ұсына отырып, XML анализаторы DOM (Document Object Model,құжаттың обьектілік моделі) құрады. Бұл моделдің шегінде DOM-ағаш түйіні кездейсоқ қол жеткізу үшін қол жетімді, ал түйіндер арасындағы өтпе үшін әдістер реті қарастырылған.

Осы екі тәсілді жоғарыда көрсетілген XML-құжатын қалыптастыру үшін қолдануға болады.

SAX арқылы құжат былай қалыптасады:

import sys

from xml.sax.saxutils import XMLGenerator

g = XMLGenerator(sys.stdout)

g.startDocument()

g.startElement("expression", {})

g.startElement("operation", {"type": "+"})

g.startElement("operand", {})

g.characters("2")

g.endElement("operand")

g.startElement("operand", {})

g.startElement("operation", {"type": "*"})

g.startElement("operand", {})

g.characters("3")

g.endElement("operand")

g.startElement("operand", {})

g.characters("4")

g.endElement("operand")

g.endElement("operation")

g.endElement("operand")

g.endElement("operation")

g.endElement("expression")

g.endDocument(

Ағаш құрудың обьектілі моделі құжатының мысалы былай көрінуі мүмкін:

from xml.dom import minidom

dom = minidom.Document()

e1 = dom.createElement("expression")

dom.appendChild(e1)

p1 = dom.createElement("operation")

p1.setAttribute('type', '+')

x1 = dom.createElement("operand")

x1.appendChild(dom.createTextNode("2"))

p1.appendChild(x1)

e1.appendChild(p1)

p2 = dom.createElement("operation")

p2.setAttribute('type', '*')

x2 = dom.createElement("operand")

x2.appendChild(dom.createTextNode("3"))

p2.appendChild(x2)

x3 = dom.createElement("operand")

x3.appendChild(dom.createTextNode("4"))

p2.appendChild(x3)

x4 = dom.createElement("operand")

x4.appendChild(p2)

p1.appendChild(x4)

print dom.toprettyxml()

Тегтер генерациясында және басқа бөліктерінде SAX командасын қолдану кезекті түрде берілетінін аңғару оңай, ал бірдей DOM-дарды ағындарды қалыптастыру командарының түрлі кезектестігі және оның басқа ағындармен байланысы арқылы құруға болады.

Әрине, көрсетілген мысалдар теориялық сипатқа ие, өйткені іс жүзінде XML-құжаттарын осылайша құру әдетте келмейді.

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-ұсынуында берілген өрнектің мәнін шығаратын функцияларды құру ұсынылады.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]