<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="cs">
	<id>http://postgres.cz/index.php?action=history&amp;feed=atom&amp;title=Parsov%C3%A1n%C3%AD_XML_v_PLPythonu</id>
	<title>Parsování XML v PLPythonu - Historie editací</title>
	<link rel="self" type="application/atom+xml" href="http://postgres.cz/index.php?action=history&amp;feed=atom&amp;title=Parsov%C3%A1n%C3%AD_XML_v_PLPythonu"/>
	<link rel="alternate" type="text/html" href="http://postgres.cz/index.php?title=Parsov%C3%A1n%C3%AD_XML_v_PLPythonu&amp;action=history"/>
	<updated>2026-05-30T19:33:34Z</updated>
	<subtitle>Historie editací této stránky</subtitle>
	<generator>MediaWiki 1.43.3</generator>
	<entry>
		<id>http://postgres.cz/index.php?title=Parsov%C3%A1n%C3%AD_XML_v_PLPythonu&amp;diff=565&amp;oldid=prev</id>
		<title>imported&gt;Pavel: Založena nová stránka s textem „Mějme XML ve tvaru: &lt;pre&gt; &lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;yes&quot; ?&gt; &lt;ciselnik&gt; &lt;nazev&gt;kn_i&lt;/nazev&gt; &lt;data&gt;   &lt;radek&gt;     &lt;kn&gt;01011010&lt;/kn&gt;…“</title>
		<link rel="alternate" type="text/html" href="http://postgres.cz/index.php?title=Parsov%C3%A1n%C3%AD_XML_v_PLPythonu&amp;diff=565&amp;oldid=prev"/>
		<updated>2015-04-04T08:30:04Z</updated>

		<summary type="html">&lt;p&gt;Založena nová stránka s textem „Mějme XML ve tvaru: &amp;lt;pre&amp;gt; &amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot; standalone=&amp;quot;yes&amp;quot; ?&amp;gt; &amp;lt;ciselnik&amp;gt; &amp;lt;nazev&amp;gt;kn_i&amp;lt;/nazev&amp;gt; &amp;lt;data&amp;gt;   &amp;lt;radek&amp;gt;     &amp;lt;kn&amp;gt;01011010&amp;lt;/kn&amp;gt;…“&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Nová stránka&lt;/b&gt;&lt;/p&gt;&lt;div&gt;Mějme XML ve tvaru:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot; standalone=&amp;quot;yes&amp;quot; ?&amp;gt;&lt;br /&gt;
&amp;lt;ciselnik&amp;gt;&lt;br /&gt;
&amp;lt;nazev&amp;gt;kn_i&amp;lt;/nazev&amp;gt;&lt;br /&gt;
&amp;lt;data&amp;gt;&lt;br /&gt;
  &amp;lt;radek&amp;gt;&lt;br /&gt;
    &amp;lt;kn&amp;gt;01011010&amp;lt;/kn&amp;gt;&lt;br /&gt;
    &amp;lt;od&amp;gt;2005-01-01&amp;lt;/od&amp;gt;&lt;br /&gt;
    &amp;lt;do&amp;gt;2011-12-31&amp;lt;/do&amp;gt;&lt;br /&gt;
    &amp;lt;mj_i&amp;gt;PCE&amp;lt;/mj_i&amp;gt;&lt;br /&gt;
    &amp;lt;trida&amp;gt;1&amp;lt;/trida&amp;gt;&lt;br /&gt;
    &amp;lt;tridarim&amp;gt;I&amp;lt;/tridarim&amp;gt;&lt;br /&gt;
    &amp;lt;popis&amp;gt;Živí, čistokrevní, chovní koně&amp;lt;/popis&amp;gt;&lt;br /&gt;
    &amp;lt;popisan&amp;gt;Pure-bred breeding horses&amp;lt;/popisan&amp;gt;&lt;br /&gt;
  &amp;lt;/radek&amp;gt;&lt;br /&gt;
  &amp;lt;radek&amp;gt;&lt;br /&gt;
    &amp;lt;kn&amp;gt;01011090&amp;lt;/kn&amp;gt;&lt;br /&gt;
    &amp;lt;od&amp;gt;2005-01-01&amp;lt;/od&amp;gt;&lt;br /&gt;
    &amp;lt;do&amp;gt;2011-12-31&amp;lt;/do&amp;gt;&lt;br /&gt;
    &amp;lt;mj_i&amp;gt;PCE&amp;lt;/mj_i&amp;gt;&lt;br /&gt;
    &amp;lt;trida&amp;gt;1&amp;lt;/trida&amp;gt;&lt;br /&gt;
    &amp;lt;tridarim&amp;gt;I&amp;lt;/tridarim&amp;gt;&lt;br /&gt;
    &amp;lt;popis&amp;gt;Živí, čistokrevní, chovní osli&amp;lt;/popis&amp;gt;&lt;br /&gt;
    &amp;lt;popisan&amp;gt;Pure-bred breeding asses&amp;lt;/popisan&amp;gt;&lt;br /&gt;
  &amp;lt;/radek&amp;gt;&lt;br /&gt;
  &amp;lt;radek&amp;gt;&lt;br /&gt;
  ...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Tento dokument chceme převést na tabulku. Po chvilce googlování jsem napsal kód:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CREATE OR REPLACE FUNCTION public.parse_xml(x xml, OUT kn text, OUT od date, OUT &amp;quot;do&amp;quot; date, OUT mj_i text, OUT trida text, OUT tridarim text, OUT popis text, OUT popisan text)&lt;br /&gt;
 RETURNS SETOF record LANGUAGE plpython2u&lt;br /&gt;
AS $function$&lt;br /&gt;
import cStringIO&lt;br /&gt;
import libxml2&lt;br /&gt;
&lt;br /&gt;
XMLREADER_START_ELEMENT_NODE_TYPE = 1&lt;br /&gt;
XMLREADER_TEXT_ELEMENT_NODE_TYPE = 3&lt;br /&gt;
XMLREADER_END_ELEMENT_NODE_TYPE = 15&lt;br /&gt;
&lt;br /&gt;
stream = cStringIO.StringIO(x)&lt;br /&gt;
input_source = libxml2.inputBuffer(stream)&lt;br /&gt;
reader = input_source.newTextReader(&amp;quot;urn:bogus&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
read_value = False&lt;br /&gt;
result = []&lt;br /&gt;
&lt;br /&gt;
while reader.Read():&lt;br /&gt;
    if reader.NodeType() == XMLREADER_START_ELEMENT_NODE_TYPE:&lt;br /&gt;
        if reader.LocalName() == &amp;quot;radek&amp;quot;: # zacatek datoveho uzlu&lt;br /&gt;
            read_value = True&lt;br /&gt;
            row_data = {&amp;#039;trida&amp;#039;:None,&amp;#039;tridarim&amp;#039;:None} # potencialne prazdne polozky&lt;br /&gt;
            continue&lt;br /&gt;
        else:&lt;br /&gt;
            node_name = reader.LocalName()&lt;br /&gt;
   &lt;br /&gt;
    if reader.NodeType() == XMLREADER_END_ELEMENT_NODE_TYPE:&lt;br /&gt;
        if reader.LocalName() == &amp;quot;radek&amp;quot;: # opusteni datoveho uzlu&lt;br /&gt;
            read_value = False&lt;br /&gt;
            result.append(row_data)&lt;br /&gt;
            continue&lt;br /&gt;
&lt;br /&gt;
    if reader.NodeType() == XMLREADER_TEXT_ELEMENT_NODE_TYPE:&lt;br /&gt;
        if read_value:&lt;br /&gt;
            row_data[node_name] = reader.Value()&lt;br /&gt;
            &lt;br /&gt;
return result&lt;br /&gt;
$function$&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>imported&gt;Pavel</name></author>
	</entry>
</feed>