<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>geko &#187; Programavimas</title>
	<atom:link href="http://www.geko.lt/blog/category/programavimas/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.geko.lt/blog</link>
	<description>Geras Kodas</description>
	<lastBuildDate>Sun, 13 Jun 2010 10:32:07 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>XML nagrinėjimas su Pythonu</title>
		<link>http://www.geko.lt/blog/2009/04/06/xml-nagrinejimas-su-pythonu/</link>
		<comments>http://www.geko.lt/blog/2009/04/06/xml-nagrinejimas-su-pythonu/#comments</comments>
		<pubDate>Mon, 06 Apr 2009 06:29:21 +0000</pubDate>
		<dc:creator>Paulius</dc:creator>
				<category><![CDATA[Programavimas]]></category>
		<category><![CDATA[HowTo]]></category>
		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://www.geko.lt/blog/?p=329</guid>
		<description><![CDATA[Šiandien gavau užduotį:  XML faile rasti sutrumpintą tekstą ir jį pakeisti pilnu. Su programavimu susipažinau pradėjęs studijuoti KTU, daug laiko jam niekada neskyriau, tad ir  žinių &#8211; ne per daugiausia. Bet karts nuo karto kokią nors  užduotelę  išspręsti būna visai fun (ypatingai, kai pavyksta).
Apie Pythoną esu girdėjęs daug gero, tad pastaruoju metu vis išbandau jį. [...]]]></description>
			<content:encoded><![CDATA[<p>Šiandien gavau užduotį:  XML faile rasti sutrumpintą tekstą ir jį pakeisti pilnu. Su programavimu susipažinau pradėjęs studijuoti KTU, daug laiko jam niekada neskyriau, tad ir  žinių &#8211; ne per daugiausia. Bet karts nuo karto kokią nors  užduotelę  išspręsti būna visai fun (ypatingai, kai pavyksta).</p>
<p>Apie Pythoną esu girdėjęs daug gero, tad pastaruoju metu vis išbandau jį. Džiugu, kad iki šiol neprašoviau pro šalį pasirinkdamas šią kalbą. Savaime suprantama, išmokti dirbti su nauja biblioteka,  šiuo atveju &#8211; <a href="http://docs.python.org/library/xml.dom.minidom.html">xml.dom.minidom</a> &#8211; užtrunka. Tačiau prieš tai neteko dirbti su XML failais, tad kitu atveju užtrukčiau dar ilgiau.  Tiems, kas menkai susipažinęs  su šia kalba -  daug geros informacijos  <a href="http://blog.sandbox.lt/lt/Python">Daliaus bloge</a>.</p>
<p>Su mano pagrindais programavime, kokybės algoritmuose nepamatysite. Tačiau tikiuosi parodyti kaip paprastai įgyvendinti užduotį <em>(sutrumpinti knygų pavadinimai pakeičiami į pilnus)</em> su šia &#8220;gyvate&#8221;.</p>
<p> <span id="more-329"></span></p>
<p>Knygų duomenys XML formatu bei naujų knygų pavadinimų sąrašas:</p>

<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #ddbb00;">&amp;lt;</span>?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot; ?<span style="color: #ddbb00;">&amp;gt;</span>
<span style="color: #ddbb00;">&amp;lt;</span>knyga<span style="color: #ddbb00;">&amp;gt;</span>
  <span style="color: #ddbb00;">&amp;lt;</span>data<span style="color: #ddbb00;">&amp;gt;</span>
     <span style="color: #ddbb00;">&amp;lt;</span>record id=&quot;0&quot;<span style="color: #ddbb00;">&amp;gt;</span>
      <span style="color: #ddbb00;">&amp;lt;</span>field name=&quot;code&quot;<span style="color: #ddbb00;">&amp;gt;</span>0<span style="color: #ddbb00;">&amp;lt;</span>/field<span style="color: #ddbb00;">&amp;gt;</span>
      <span style="color: #ddbb00;">&amp;lt;</span>field name=&quot;title&quot;<span style="color: #ddbb00;">&amp;gt;</span>Wikinomics<span style="color: #ddbb00;">&amp;lt;</span>/field<span style="color: #ddbb00;">&amp;gt;</span>
      <span style="color: #ddbb00;">&amp;lt;</span>field name=&quot;author&quot;<span style="color: #ddbb00;">&amp;gt;</span>Don Tapscott<span style="color: #ddbb00;">&amp;lt;</span>/field<span style="color: #ddbb00;">&amp;gt;</span>
     <span style="color: #ddbb00;">&amp;lt;</span>/record<span style="color: #ddbb00;">&amp;gt;</span>
     <span style="color: #ddbb00;">&amp;lt;</span>record id=&quot;1&quot;<span style="color: #ddbb00;">&amp;gt;</span>
      <span style="color: #ddbb00;">&amp;lt;</span>field name=&quot;code&quot;<span style="color: #ddbb00;">&amp;gt;</span>2<span style="color: #ddbb00;">&amp;lt;</span>/field<span style="color: #ddbb00;">&amp;gt;</span>
      <span style="color: #ddbb00;">&amp;lt;</span>field name=&quot;title&quot;<span style="color: #ddbb00;">&amp;gt;</span>The success of OS<span style="color: #ddbb00;">&amp;lt;</span>/field<span style="color: #ddbb00;">&amp;gt;</span>
      <span style="color: #ddbb00;">&amp;lt;</span>field name=&quot;author&quot;<span style="color: #ddbb00;">&amp;gt;</span>Steve Weber<span style="color: #ddbb00;">&amp;lt;</span>/field<span style="color: #ddbb00;">&amp;gt;</span>
    <span style="color: #ddbb00;">&amp;lt;</span>/record<span style="color: #ddbb00;">&amp;gt;</span>
  <span style="color: #ddbb00;">&amp;lt;</span>/data<span style="color: #ddbb00;">&amp;gt;</span>
<span style="color: #ddbb00;">&amp;lt;</span>/knyga<span style="color: #ddbb00;">&amp;gt;</span></pre></div></div>


<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">0
Wikinomics: How mass collaboration changes everything
1
The success of open source</pre></div></div>

<p>Pradžioje paprasčiausiai nuskaitome  naujus knygų pavadinimus:</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">def</span> read<span style="color: black;">&#40;</span>name<span style="color: black;">&#41;</span>:
    listas = <span style="color: black;">&#91;</span><span style="color: black;">&#93;</span>
    <span style="color: #ff7700;font-weight:bold;">for</span> line <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">open</span><span style="color: black;">&#40;</span>name, <span style="color: #483d8b;">&quot;rb&quot;</span><span style="color: black;">&#41;</span>:   <span style="color: #808080; font-style: italic;"># skaitom po eilutę duomenų failą</span>
        listas.<span style="color: black;">append</span><span style="color: black;">&#40;</span>line.<span style="color: black;">strip</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span> <span style="color: #808080; font-style: italic;"># rašom duomenis į sąrašo galą,</span>
    <span style="color: #ff7700;font-weight:bold;">return</span> listas                   <span style="color: #808080; font-style: italic;"># prieš tai pašalinę naujos eilutės simbolius</span></pre></div></div>

<p>Metodai, kuriais nagrinėjau XML ir ieškojau reikiamų eilučių.  Visus šiuos veiksmus man padėjo atlikti  <a href="http://docs.python.org/library/xml.dom.minidom.html">xml.dom.minidom</a>, tai buvo gana paprasta, tiesiog  teko susipažinti su <a href="http://docs.python.org/library/xml.dom.html">DOM API</a>.</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">def</span> parese<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:
    knygos = <span style="color: #dc143c;">xml</span>.<span style="color: black;">dom</span>.<span style="color: black;">minidom</span>.<span style="color: black;">parse</span> <span style="color: black;">&#40;</span><span style="color: #483d8b;">'knyga.xml'</span><span style="color: black;">&#41;</span> <span style="color: #808080; font-style: italic;">#nuskaitom xml failą</span>
    <span style="color: #ff7700;font-weight:bold;">return</span> knygos
&nbsp;
<span style="color: #ff7700;font-weight:bold;">def</span> change<span style="color: black;">&#40;</span>ID, newname, knygos<span style="color: black;">&#41;</span>:
    records = knygos.<span style="color: black;">documentElement</span>.<span style="color: black;">getElementsByTagName</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'record'</span><span style="color: black;">&#41;</span> <span style="color: #808080; font-style: italic;"># randame record elementus</span>
    <span style="color: #ff7700;font-weight:bold;">for</span> record <span style="color: #ff7700;font-weight:bold;">in</span> records:
        <span style="color: #ff7700;font-weight:bold;">if</span> record.<span style="color: black;">attributes</span><span style="color: black;">&#91;</span><span style="color: #483d8b;">'id'</span><span style="color: black;">&#93;</span>.<span style="color: black;">nodeValue</span> == ID: <span style="color: #808080; font-style: italic;"># Jeigu record id sutampa su pilno pavadinimo id</span>
            fields = record.<span style="color: black;">getElementsByTagName</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'field'</span><span style="color: black;">&#41;</span> <span style="color: #808080; font-style: italic;"># randame visus field elementus</span>
            <span style="color: #ff7700;font-weight:bold;">for</span> field <span style="color: #ff7700;font-weight:bold;">in</span> fields:
                <span style="color: #ff7700;font-weight:bold;">if</span> field.<span style="color: black;">attributes</span><span style="color: black;">&#91;</span><span style="color: #483d8b;">'name'</span><span style="color: black;">&#93;</span>.<span style="color: black;">nodeValue</span> == <span style="color: #483d8b;">'title'</span>: <span style="color: #808080; font-style: italic;"># Jeigu field name atributas tinkamas</span>
                    field.<span style="color: black;">childNodes</span><span style="color: black;">&#91;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#93;</span>.<span style="color: black;">nodeValue</span> = newname  <span style="color: #808080; font-style: italic;"># priskiriame pilną knygos pavadinimą</span>
    <span style="color: #ff7700;font-weight:bold;">return</span> knygos</pre></div></div>

<p>Likusieji  trys metodai:  paieškos, mūsų naujos XML struktūros išsaugojimas bei paleidžiamasis metodas main. XML išsaugojimui panaudojau <a href="http://www.xml.com/pub/a/2002/09/25/py.html">PyXML</a> biblioteką, vien todėl,  kad minidom saugojimo funkcija <a href="http://ronrothman.com/public/leftbraned/xml-dom-minidom-toprettyxml-and-silly-whitespace/">toprettyxml()</a> palieka nereikalingas tuščias vietas.</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">def</span> search<span style="color: black;">&#40;</span>alist<span style="color: black;">&#41;</span>:
    knygos = parese<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
    n = <span style="color: #ff4500;">0</span>
    <span style="color: #ff7700;font-weight:bold;">for</span> n <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">range</span><span style="color: black;">&#40;</span><span style="color: #008000;">len</span><span style="color: black;">&#40;</span>alist<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>:
        <span style="color: #ff7700;font-weight:bold;">if</span> n <span style="color: #66cc66;">%</span> <span style="color: #ff4500;">2</span> == <span style="color: #ff4500;">0</span>:
            knygos = change<span style="color: black;">&#40;</span>alist<span style="color: black;">&#91;</span>n<span style="color: black;">&#93;</span>, alist<span style="color: black;">&#91;</span>n+<span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span>, knygos<span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">return</span> knygos
&nbsp;
<span style="color: #ff7700;font-weight:bold;">def</span> createxml<span style="color: black;">&#40;</span>fname, knygos<span style="color: black;">&#41;</span>:
    failas = <span style="color: #008000;">open</span><span style="color: black;">&#40;</span>fname, <span style="color: #483d8b;">&quot;w&quot;</span><span style="color: black;">&#41;</span>
    <span style="color: #dc143c;">xml</span>.<span style="color: black;">dom</span>.<span style="color: black;">ext</span>.<span style="color: black;">PrettyPrint</span><span style="color: black;">&#40;</span>knygos, failas<span style="color: black;">&#41;</span> <span style="color: #808080; font-style: italic;"># panaudoję xml.dom.ext biblioteką</span>
    failas.<span style="color: black;">close</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">def</span> main<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:
    alist = read<span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;knygos&quot;</span><span style="color: black;">&#41;</span>
    knygos = search<span style="color: black;">&#40;</span>alist<span style="color: black;">&#41;</span>
    createxml<span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;knyga_new.xml&quot;</span>, knygos<span style="color: black;">&#41;</span></pre></div></div>

<p>Rezultatas, kuris mane tenkino:</p>

<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #ddbb00;">&amp;lt;</span>?xml version='1.0' encoding='UTF-8'?<span style="color: #ddbb00;">&amp;gt;</span>
<span style="color: #ddbb00;">&amp;lt;</span>knyga<span style="color: #ddbb00;">&amp;gt;</span>
  <span style="color: #ddbb00;">&amp;lt;</span>data<span style="color: #ddbb00;">&amp;gt;</span>
    <span style="color: #ddbb00;">&amp;lt;</span>record id='0'<span style="color: #ddbb00;">&amp;gt;</span>
      <span style="color: #ddbb00;">&amp;lt;</span>field name='code'<span style="color: #ddbb00;">&amp;gt;</span>0<span style="color: #ddbb00;">&amp;lt;</span>/field<span style="color: #ddbb00;">&amp;gt;</span>
      <span style="color: #ddbb00;">&amp;lt;</span>field name='title'<span style="color: #ddbb00;">&amp;gt;</span>Wikinomics: How mass collaboration changes everything<span style="color: #ddbb00;">&amp;lt;</span>/field<span style="color: #ddbb00;">&amp;gt;</span>
      <span style="color: #ddbb00;">&amp;lt;</span>field name='author'<span style="color: #ddbb00;">&amp;gt;</span>Don Tapscott<span style="color: #ddbb00;">&amp;lt;</span>/field<span style="color: #ddbb00;">&amp;gt;</span>
    <span style="color: #ddbb00;">&amp;lt;</span>/record<span style="color: #ddbb00;">&amp;gt;</span>
    <span style="color: #ddbb00;">&amp;lt;</span>record id='1'<span style="color: #ddbb00;">&amp;gt;</span>
      <span style="color: #ddbb00;">&amp;lt;</span>field name='code'<span style="color: #ddbb00;">&amp;gt;</span>2<span style="color: #ddbb00;">&amp;lt;</span>/field<span style="color: #ddbb00;">&amp;gt;</span>
      <span style="color: #ddbb00;">&amp;lt;</span>field name='title'<span style="color: #ddbb00;">&amp;gt;</span>The success of open source<span style="color: #ddbb00;">&amp;lt;</span>/field<span style="color: #ddbb00;">&amp;gt;</span>
      <span style="color: #ddbb00;">&amp;lt;</span>field name='author'<span style="color: #ddbb00;">&amp;gt;</span>Steve Weber<span style="color: #ddbb00;">&amp;lt;</span>/field<span style="color: #ddbb00;">&amp;gt;</span>
    <span style="color: #ddbb00;">&amp;lt;</span>/record<span style="color: #ddbb00;">&amp;gt;</span>
  <span style="color: #ddbb00;">&amp;lt;</span>/data<span style="color: #ddbb00;">&amp;gt;</span>
<span style="color: #ddbb00;">&amp;lt;</span>/knyga<span style="color: #ddbb00;">&amp;gt;</span></pre></div></div>

<p>Manau, Pythonas bus ganėtinai dažnai mano naudojama programavimo kalba. Nors optimistiškai spėju, kad su programavimu ateityje mažai susidursiu.</p>
<p><a href="http://www.geko.lt/blog/wp-content/uploads/2009/04/py_xml_change_source_code.zip">py_xml_change_source_code</a>.</p>
<p><em>P.S. Berašant šį įrašą perskaičiau įdomų<a href="http://techczar.wordpress.com/2009/03/29/the-current-state-and-future-of-python/"> įrašą apie dabartį ir Python`o ateitį</a>.</em></p>
]]></content:encoded>
			<wfw:commentRss>http://www.geko.lt/blog/2009/04/06/xml-nagrinejimas-su-pythonu/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
