Portál AbcLinuxu, 6. listopadu 2025 14:19
while ($xmlretezec =~ /(<NewsItem>[\s\S]+<\/NewsItem>)/g) {
$counter++;
$pole[$counter] = $1;
};
<NewsItem>....</NewsItem><NewsItem>+++++</NewsItem>
</NewsItem> nechat probehnout cyklus a pak pokracovat, kde skoncil - tj za prvnim vyskytem </NewsItem> a to opakovat az do konce souboru...
Predem diky za jakkoukoliv reakci, je mi jasny ze zrejme nechapu jak to funguje :-/
soubor.xml třeba tento obsah
<xml>
<NewsItem>prvni</NewsItem>
<NewsItem>druhy</NewsItem>
<NewsItem>treti</NewsItem>
</xml>
pak by se dal parsovat třeba tímto
#!/usr/bin/env python
from elementtree.ElementTree import *
root = ElementTree(file='soubor.xml')
for news in root.getroot():
print news.text
a výsledek by byl
prvni druhy tretiKdybys podrobněji popsal strukturu tvého xml souboru, dalo by se to napsat přímo na míru.
while($xmlretezec =~ s#(<NewsItem>[\s\S]+</NewsItem>)##)
{
$counter++;
$pole[$counter] = $1;
}
nebo pokud se zbavím citové vazby na cyklus while
takhle:
for($counter=0;$xmlretezec =~ s#<NewsItem>[\s\S]+</NewsItem>##;$counter++)
{
$pole[$counter] = $1;
}
což je mnohem lepší řešení, protože má o jeden řádek méně :))) (vtip)
Musim vas zklamat, ale nemate pravdu. Problem je v defaultni zravosti regexpu. Pokud tuto neomezite, coz jste neudelal, tak kod fungovat nebude. Navic jste v prikladu s cyklem for opomenul rici PERLu aby si nalezenou shodu zapamatoval. Nasledujici kod by uz mel fungovat, ma vsak jednu vlastnost ktera vy se nemusela byt zcela zadouci a to, ze modifikuje puvodni text v promenne $xmlretezec - vsechny nalezene shody proste z puvodniho textu vyrizne...
for($counter=0;$xmlretezec =~ s#(<NewsItem>[\s\S]+?</NewsItem>)##;$counter++) {
$pole[$counter] = $1;
}
Problem tkvi v tom, ze regularni vyrazy v PERL jsou zrave a snazi se najit co nejdelsi shodu, takze pro takto zadany regexp vezmou prvni znacku <NewsItem> a pak vsechno az po posledni znacku </NewsItem> kterou v promenne $xmlretezec najde. Staci omezit tuto defaultni zravost perlu pridanim '?' za '+' a kod se bude chovat tak jak ocekavate.
while ($xmlretezec =~ /(<NewsItem>[\s\S]+?<\/NewsItem>)/g) {
$counter++;
$pole[$counter] = $1;
}
A pokud to ma jen prijit na konec nejakeho pole, tak to jde i takto
push @pole, $xmlretezec =~ /(<NewsItem>[\s\S]+?<\/NewsItem>)/g;
modifikátor:
s
Treat string as single line. That is, change ``.'' to match any character whatsoever, even a newline, which it normally would not match.
výsledok:
while ($xmlretezec =~ /\G.*?(<NewsItem>.+?<\/NewsItem>)/gs) {
push @pole, $1;
};
while ($xmlretezec =~ /(<NewsItem>.+?<\/NewsItem>)/gs) {
push @pole, $1;
};Viz: $ perl -le '$/=undef;$a=<>;while($a=~/(<NewsItem>.+?<\/NewsItem>)/gs){print $1}' <<EOF
<xml>
<NewsItem>pr
vni</NewsItem>
<NewsItem>druhy</NewsItem>
<NewsItem>tr
et
i</NewsItem>
</xml>
EOF
while ($xmlretezec =~ /(<NewsItem>(.+?)<\/NewsItem>)/gs) {
push @pole, $1 if $2;
};

.*?, keď element obsahuje text s dĺžkou 0.
python << EOF
from elementtree.ElementTree import *
xml = '''
<xml>
<NewsItem attr='bleble'>prvni</NewsItem>
<NewsItem >dr
uhy<tento_tag_nechci>ignoruj</tento_tag_nechci></NewsItem>
<NewsItem>treti</NewsItem>
</xml>
'''
elem = fromstring(xml)
pole = [news.text for news in elem.getiterator('NewsItem')]
print pole
EOF
Uvádím výsledek pro ty, kterým je proti srsti vzít do myši úplně cizí kód a strčit si ho do terminálu
['prvni', 'dr\n uhy', 'treti']
['prvni', 'dr\n <tento_tag_nechci>ignoruj</tento_tag_nechci>uhy', 'treti']keď už

python << EOF
from elementtree.ElementTree import *
import re
xml = '''
<xml>
<NewsItem attr='bleble'>prvni</NewsItem>
<NewsItem >dr
uhy<tento_tag_nechci>ignoruj</tento_tag_nechci></NewsItem>
<NewsItem>treti</NewsItem>
</xml>
'''
elem = fromstring(xml)
for e in elem.getiterator():
print (e.tag, e.text)
EOF
Výsledek:
('xml', '\n ')
('NewsItem', 'prvni')
('NewsItem', 'dr\n uhy')
('tento_tag_nechci', 'ignoruj')
('NewsItem', 'treti')
že se ptal na implementaci v perlu což výslovně uvedl v přímo v titulku dotazu.To že J.M. neustále u všech hledaných řešení doplňuje i o svoje řešení v Pythonu, to vidím jako plus a vůbec bych ho od toho neodrazoval. Jestli dotazující řešení v Pythonu nepoužije, nevadí (může to mlčky přehlédnout). Ale pro ostatní "přihlížející" návštěvníky to může být zajímavá ukázka a alternativa, jak to lze řešit i jinak. Takže jen tak dál, i když je požadavek třeba na Perl, proč si neprohlédnout i jiná řešení ...
. Protože kdybych někdy potřeboval a chtěl proniknout do tajů Pythonu, Tvé příspěvky mi budou sloužit jako praktické ukázky.
<NewsItem><b>Category:</b> <i>title</i></NewsItem>a podobne, ako príklad to snáď postačuje
Jedna se o skript do cronu, ktery ma stahnout httpkem xml soubor s novinkami (obsazenymi v tagu newsitem) od posledniho stazeni. A ulozit kazdou novinku jako samostatny xml soubor pod datem jejiho vydani. Nejake cms si z nich pote nacita data.
Nejsem programator, takze jsem si zjednodussil praci wgetem ls apod.
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.