Prosíme přihlašte se nebo zaregistrujte.

Přihlašte se svým uživatelským jménem a heslem.
Vaše pomoc je stále potřeba!

Autor Téma: Perl a Xpath  (Přečteno 4370 krát)

Jezza

  • Návštěvník
  • Příspěvků: 96
Perl a Xpath
« kdy: 14 Dubna 2009, 16:49:16 »
Mam takovyto xml soubor:

Kód: [Vybrat]
<?xml version='1.0' encoding='UTF-8'?>
<oval_definitions >
  <definitions>
<definition id="oval:com.redhat.rhsa:def:20090256" version="302" class="patch">
<metadata>
<title>RHSA-2009:0256: firefox security update (Critical)
</title>
<affected>
<platform>Red Hat Enterprise Linux 4</platform>
<platform>Red Hat Enterprise Linux 5</platform>
</affected>
<reference source="RHSA" ref_id="RHSA-2009:0256-01" ref_url="https://rhn.redhat.com/errata/RHSA-2009-0256.html" />
<description>Mozilla Firefox is an open source Web browser.

Several flaws were found in the processing of malformed web content. A web
page containing malicious content could cause Firefox to crash or,
potentially, execute arbitrary code as the user running Firefox.
(CVE-2009-0352, CVE-2009-0353, CVE-2009-0356)

</description>
<advisory from="secalert@redhat.com">

<severity>Critical</severity>

<rights>Copyright 2009 Red Hat, Inc.</rights>
<issued date="2009-02-04" />
<updated date="2009-02-04" />
<cve href="http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2009-0352">CVE-2009-0352</cve>
<cve href="http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2009-0353">CVE-2009-0353</cve>
</advisory>
</metadata>
<criteria operator="OR">

<criteria operator="AND">
<criterion test_ref="oval:com.redhat.rhsa:tst:20090003001" comment="Red Hat Enterprise Linux 5 is installed" />
<criteria operator="OR">

<criteria operator="AND">
<criterion test_ref="oval:com.redhat.rhsa:tst:20090256004" comment="xulrunner-devel-unstable is earlier than 0:1.9.0.6-1.el5" /><criterion test_ref="oval:com.redhat.rhsa:tst:20090256005" comment="xulrunner-devel-unstable is signed with Red Hat redhatrelease key" />

</criteria>
<criteria operator="AND">
<criterion test_ref="oval:com.redhat.rhsa:tst:20090256002" comment="xulrunner is earlier than 0:1.9.0.6-1.el5" /><criterion test_ref="oval:com.redhat.rhsa:tst:20090256003" comment="xulrunner is signed with Red Hat redhatrelease key" />

</criteria>
<criteria operator="AND">
<criterion test_ref="oval:com.redhat.rhsa:tst:20090256006" comment="xulrunner-devel is earlier than 0:1.9.0.6-1.el5" /><criterion test_ref="oval:com.redhat.rhsa:tst:20090256007" comment="xulrunner-devel is signed with Red Hat redhatrelease key" />

</criteria>
<criteria operator="AND">
<criterion test_ref="oval:com.redhat.rhsa:tst:20090256008" comment="firefox is earlier than 0:3.0.6-1.el5" /><criterion test_ref="oval:com.redhat.rhsa:tst:20090256009" comment="firefox is signed with Red Hat redhatrelease key" />

</criteria>
<criteria operator="AND">
<criterion test_ref="oval:com.redhat.rhsa:tst:20090256012" comment="nss is earlier than 0:3.12.2.0-4.el5" /><criterion test_ref="oval:com.redhat.rhsa:tst:20090256013" comment="nss is signed with Red Hat redhatrelease key" />

</criteria>
<criteria operator="AND">
<criterion test_ref="oval:com.redhat.rhsa:tst:20090256010" comment="nss-tools is earlier than 0:3.12.2.0-4.el5" /><criterion test_ref="oval:com.redhat.rhsa:tst:20090256011" comment="nss-tools is signed with Red Hat redhatrelease key" />

</criteria>
<criteria operator="AND">
<criterion test_ref="oval:com.redhat.rhsa:tst:20090256016" comment="nss-devel is earlier than 0:3.12.2.0-4.el5" /><criterion test_ref="oval:com.redhat.rhsa:tst:20090256017" comment="nss-devel is signed with Red Hat redhatrelease key" />

</criteria>
<criteria operator="AND">
<criterion test_ref="oval:com.redhat.rhsa:tst:20090256014" comment="nss-pkcs11-devel is earlier than 0:3.12.2.0-4.el5" /><criterion test_ref="oval:com.redhat.rhsa:tst:20090256015" comment="nss-pkcs11-devel is signed with Red Hat redhatrelease key" />

</criteria>

</criteria>

</criteria>
<criteria operator="AND">
<criterion test_ref="oval:com.redhat.rhsa:tst:20090004019" comment="Red Hat Enterprise Linux 4 is installed" />
<criteria operator="OR">

<criteria operator="AND">
<criterion test_ref="oval:com.redhat.rhsa:tst:20090256019" comment="firefox is earlier than 0:3.0.6-1.el4" /><criterion test_ref="oval:com.redhat.rhsa:tst:20090256020" comment="firefox is signed with Red Hat master key" />

</criteria>
<criteria operator="AND">
<criterion test_ref="oval:com.redhat.rhsa:tst:20090256023" comment="nss is earlier than 0:3.12.2.0-3.el4" /><criterion test_ref="oval:com.redhat.rhsa:tst:20090256024" comment="nss is signed with Red Hat master key" />

</criteria>
<criteria operator="AND">
<criterion test_ref="oval:com.redhat.rhsa:tst:20090256025" comment="nss-tools is earlier than 0:3.12.2.0-3.el4" /><criterion test_ref="oval:com.redhat.rhsa:tst:20090256026" comment="nss-tools is signed with Red Hat master key" />

</criteria>
<criteria operator="AND">
<criterion test_ref="oval:com.redhat.rhsa:tst:20090256021" comment="nss-devel is earlier than 0:3.12.2.0-3.el4" /><criterion test_ref="oval:com.redhat.rhsa:tst:20090256022" comment="nss-devel is signed with Red Hat master key" />

</criteria>

</criteria>

</criteria>

</criteria>

</definition>

</definitions>

</oval_definitions>


Chci z nej dostat urcita data a pouzivam na to skript:

Kód: [Vybrat]
use strict;
use DBI;
use XML::XPath;

my $xp = XML::XPath->new(filename => 'def.xml');

foreach my $row ($xp->findnodes('//oval_definitions/definitions/definition/metadata')) {
  print "title = ";
    print $row->find('title')->string_value;
 
    foreach my $row ($xp->findnodes('//oval_definitions/definitions/definition/metadata/affected')) {
  print "platform = ";
    print $row->find('platform')->string_value; ## jak na vice platfotm?    Jak ulozit hodnotu tagu do promente, jak vypsat atribut tagu?
   
    }
}


Potreboval bych dostat informace z tagu platform, ktery je v jedne urovni vicekrat.

Dale bych se chtel zeptat, jak ulozit do promenne tato ziskana data misto toho, ze se tisknout...zkousel jsem to ruzne, ale pise by to chyby.

Posledni dotaz je, lze ziska nejen hodnotu tagu, ale i jeho atributy, jako je treba i tagu <definition> comment a id?

Predem diky

nettezzaumana

  • Host
Re: Perl a Xpath
« Odpověď #1 kdy: 14 Dubna 2009, 20:47:51 »
a) XML::XPath neznam .. musis si to precist v manualu
b) o prirazovani promennych v perlu bylo napsano uz mnoho, nicmene copak nestaci ::

my $promenna = vyraz;

.. nevim jak jinak bys chtel prirazovat promenne ..

jfoot

  • Aktivní člen
  • *
  • Příspěvků: 197
  • ..nemožné ihned, zázraky do tří dnů...
Re: Perl a Xpath
« Odpověď #2 kdy: 14 Dubna 2009, 23:43:47 »

Zdravim Vas,

nez se pokusim odpovedet na Vasy dotazy : Perl jsem nevidel ani z rychliku, tak mi laskave nenadavejte, pokud
pouziji nektery jeho obrat v nespravnem kontextu (obdobne varovani pro obrance cistoty jazyka ceskeho, amen).

ad a) Rekneme, ze lepsi formulace je : Potrebuju dostat informaci o vsech elementech (pojem tag se v xml moc nepouziva..)
   zvoleneho jmena (zde <platform>). Mohou Vas zajimat vsechny elementy tohoto jmena 'pres cele xml'
   anebo z urcite urovne.
   Tento vyber je zalezitosti zformulovani xpath vyrazu. Ten mate spravne. Jeho vysledkem je mnozina hodnot,
   tzv. nodeset. Staci tedy, jak psal kolega pre mnou, onen nodeset ulozit do promenne a tuto promennou
   proiterovat. Treba takhle :

   my $nodeset = $xp->find('//oval_definitions/definitions/definition/metadata/affected');
   foreach my $node ($nodeset->get_nodelist) {
         print $node->getNodeValue, "\n\n"; }

   Btw : jen na okraj, pokud je <oval_definitions> root elementem, tak neni potreba pouzivat dvojite lomitko...

ad b) viz nettezzaumana...

ad c) tak jak, jste to udelal ve vasem scriptu : zformulovanim xpath vyrazu.
      Pokud budete chtit vybrat hodnotu atributu 'id' elementu 'definition' muzete na to jit pomoci
      tohoto vyrazu :
      my $nodesetA = $xp->find('/oval_definitions/definitions/@id');

      Mohl byste to udelat i takhle
      my $nodesetB = $xp->find('//@id');
      takto byste dostal hodnoty vsech atributu 'id' BEZ OHLEDU na to, v ktere 'urovni' xml stromu lezi

      Vasemu srdci nejblizsi ale bude asi toto reseni :
      my $nodesetC = $xp->find('/oval_definitions/definitions');
     
      print "Id      attribute val = ", $nodesetC->getAttribute ('id'), "\n";
      print "Version attribute val = ", $nodesetC->getAttribute ('version'), "\n";
      .... atd. zbyle atributy.....

      P.S. spravne volani veskerych zde uvedenych perlovskych metod a obratu si predpokladam, jako perlista
           overite, nerucim za jejich spravnost nejsa perlistou...
           Pokud budete vice pouzivat xpath, doporucuji kurs pana Koska...



   

Po šesté atomové válce  povrch planety Rogoz nevypadal pěkně...

Dítě nevinné...Co ty můžeš vědět...o sadomasochistické derivaci oidipovského komplexu...(O.Neff, K. Saudek, Arnal & Dva dračí zuby)

nettezzaumana

  • Host
Re: Perl a Xpath
« Odpověď #3 kdy: 15 Dubna 2009, 08:41:21 »

jfoot

  • Aktivní člen
  • *
  • Příspěvků: 197
  • ..nemožné ihned, zázraky do tří dnů...
Po šesté atomové válce  povrch planety Rogoz nevypadal pěkně...

Dítě nevinné...Co ty můžeš vědět...o sadomasochistické derivaci oidipovského komplexu...(O.Neff, K. Saudek, Arnal & Dva dračí zuby)

Jezza

  • Návštěvník
  • Příspěvků: 96
Re: Perl a Xpath
« Odpověď #5 kdy: 15 Dubna 2009, 12:18:46 »
Diky...vrhnu se na to...  8)

Jezza

  • Návštěvník
  • Příspěvků: 96
Re: Perl a Xpath
« Odpověď #6 kdy: 04 Května 2009, 15:13:38 »
Mam dalsi dotaz tykajici tohoto meho projektu:
Mam tento skript:

Kód: [Vybrat]
use strict;
use DBI;
use XML::XPath;
use XML::XPath::XMLParser;

my $dbh = DBI->connect ("DBI:mysql:test", "root", "*****", { RaiseError => 1, PrintError => 0});
my $xp = XML::XPath->new (filename => "com.redhat.rhsa-2008.xml");
my $nodelist = $xp->find ("/oval_definitions");
foreach my $row ($nodelist->get_nodelist ())
{

# naplneni tabulky definition
$dbh->do (
"INSERT INTO definition (ID_definition,title,severity,description,date) VALUES (?,?,?,?,?)",
undef,
$row->find ('definitions/definition/@id')->string_value (),
$row->find ('definitions/definition/metadata/title')->string_value (),
$row->find ('definitions/definition/metadata/advisory/severity')->string_value (),
$row->find ('definitions/definition/metadata/description')->string_value (),
$row->find ('definitions/definition/metadata/advisory/issued/@date')->string_value ()
);
$dbh->disconnect ();

Ktery hazi do tabulky v databazy obsah vyse zmineneho xml souboru, ve jehoz stromove strukture je vice podstromu <definition>.


Myslel jsem, ze takto to bude fungovat tak, ze to do databaziu nahazi data ze vsech elementu <definition>, ktere jsou ve stejne vrstve...ale ocividne to takto nefunguje.
Nevite, v cem je problem?
« Poslední změna: 05 Května 2009, 01:07:04 od Jezza »

jfoot

  • Aktivní člen
  • *
  • Příspěvků: 197
  • ..nemožné ihned, zázraky do tří dnů...
Re: Perl a Xpath
« Odpověď #7 kdy: 04 Května 2009, 23:08:33 »
Zdravim Vas,

problemy se daji ocekavat :
1. v definici xpath vyrazu
2. ve formulaci sql prikazu pouziteho v kontextu Perlu

ad 1)
   Rekl bych ze tady mate vse spravne, ovsem za predpokladu, ze
   vychazim z xml, ktere jste  zverejnil v uvodu tohoto threadu.
   
   Mala drobnost, kdybyste si chtel prodlouzit zivot,
   tak jste mohl psat :
   my $nodelist = $xp->find ("/oval_definitions/definitions/definition");
   
   a v cyklu foreach 'dolovat' jednotlive hodnoty takto :
   $row->find ('@id')->string_value (),
   $row->find ('metadata/title')->string_value (),
   $row->find ('metadata/advisory/severity')->string_value (),
   $row->find ('metadata/description')->string_value (),
   $row->find ('metadata/advisory/issued/@date')->string_value ()
   
   Jedna se ale o pomerne male prodlouzeni ....:))
   
   Predpokladam, ze jste provedl test spravnosti vyberu hodnot z xml stromu tak,
   ze jste namisto sql prikazu vypisoval jednotlive hodnoty treba na konzoli...
   
   Jeste k vete : ".. Myslel jsem, ze takto to bude fungovat tak, ze to do databaziu
                      nahazi data ze vsech elementu <definition>..."
                     
   Neni to pravda s ohledem na xml, ktere jste zde zverejnil. To totiz obsahuje
   jediny <definition>, jehoz 'obsah' se 'nahazi' do 'databaziu'  :))
   slovo obsah davam umyslne do uvozovek, protoze obsahem <definition> je o hodne vetsi
   datove spektrum, nez mate na mysli Vy. Budiz...
   
   
ad 2)     
   Tady bude pravdepodobne problem. Ackoliv je mi Perl spanelskou vesnici, tak uz vidim
   potencialni problem ve Vami zformulovanem sql.
   Pouzivate zde syntaxi pro tzv 'preparovane' prikazy. Proc ne, ovsem preparovani prikazu
   znamena pro db stroj provedeni jakesi predkompilace sql prikazu,
   ktera sama o sobe  'nedela nic'.
   Praparovany prikaz musite pote fyzicky provest pomoci 'execute' clause,
   v intencich syntaxe Perlu.
   Mrknete na odkaz vyse, ktery poslal nettezzaumana a prostudujte si
   kapitolu 13.  Perl and databases. Myslim, ze to by mohlo pomoci.
   
   
Po šesté atomové válce  povrch planety Rogoz nevypadal pěkně...

Dítě nevinné...Co ty můžeš vědět...o sadomasochistické derivaci oidipovského komplexu...(O.Neff, K. Saudek, Arnal & Dva dračí zuby)

Jezza

  • Návštěvník
  • Příspěvků: 96
Re: Perl a Xpath
« Odpověď #8 kdy: 05 Května 2009, 01:06:33 »
Citace
Mala drobnost, kdybyste si chtel prodlouzit zivot,
   tak jste mohl psat :
   my $nodelist = $xp->find ("/oval_definitions/definitions/definition");
Mam to takto zdanlive slozite proto, ze nodelist pouzivam i v dalsich foreach cyklech, ktere tahaji data z jinych vetvi xml soboru, tudiz mi zanoreni az tak hluboko znemoznilo jeho pouziti. Teda aspon podle mych slabych znalosti Xpath...

Citace
Pouzivate zde syntaxi pro tzv "preparovane" prikazy.
Myslel jsem si a stale si po preceteni zminene 13. kapitoly myslim, ze "preparovany" prikaz by byl:
Kód: [Vybrat]
my $sth -> $dbh->prepare ();. Po nem by samozrejme muselo nasledovat:
Kód: [Vybrat]
$sth->execute();. Ale ja pouzivam prikaz
Kód: [Vybrat]
my $sth -> $dbh->do ();, jenz podle me nepotrebuje "spusteni". Mylim se snad?

Netusite tedy, cim muze byt to, ze dana posloupnost prikazu pracuje pro jeden vyskyt vetve elementu <definition>, ale pokud jich tam je vice, tak probehne pouze pro prvni z nich?

jfoot

  • Aktivní člen
  • *
  • Příspěvků: 197
  • ..nemožné ihned, zázraky do tří dnů...
Re: Perl a Xpath
« Odpověď #9 kdy: 05 Května 2009, 09:35:26 »
Zdravim Vas,

OK. Muzete prilozit aktualni xml, z ktereho provadite vyber dat nyni ?

    Pridrzme se tedy Vami zformulovaneho sql prikazu .
    Ulozi se Vami pozadovana data aspon z jednoho <definition> do tabulky 'definition' ?
    ad) sql v Perl - nemuzu radit, protoze jsem nikdy nepouzival, zkuste ale postupovat takto :

    Upravte cyklus foreach treba takto :
   
    foreach my $row ($nodelist->get_nodelist ())
    { # naplneni tabulky definition
      $dbh->do (
      "INSERT INTO definition (ID_definition,title,severity,description,date)
      VALUES ('karel','nese','asi','teply','caj')";
    }
   
    Do databaze se vam musi ulozit po provedeni cyklu foreach{} tolik zaznamu
    s Karlem a cajem , kolik mate <definition> ve Vasem xml.
   
    Pokud se neulozi ani jeden - zkoumejte :
      sql   : zlikvidujte foreach a provedte znovu sql prikaz. Musi se ulozit jeden zaznam
               do databaze.
     xpath : vyraz v cyklu foreach nahradte sql prikaz prikazem  :
              "System.out.println..obsah promennych pro vystup z xpath vyrazu...."
               Pokud se vypisou vsechny pozadovane informace v poctu elementu  <definition>,
               tak muze byt chyba pravdepodobne  v predavce z promennych do kterych
               jste ukladal vystup z xpath do sql...
   
       
Po šesté atomové válce  povrch planety Rogoz nevypadal pěkně...

Dítě nevinné...Co ty můžeš vědět...o sadomasochistické derivaci oidipovského komplexu...(O.Neff, K. Saudek, Arnal & Dva dračí zuby)

Jezza

  • Návštěvník
  • Příspěvků: 96
Re: Perl a Xpath
« Odpověď #10 kdy: 05 Května 2009, 10:31:08 »
Mate pravdu, uklada to vzdy jen jednou. Ale neni mi jasne proc. Zkusil jsem takovyto test:
Kód: [Vybrat]
my $xp = XML::XPath->new (filename => "def.xml");
my $nodelist = $xp->find ("/oval_definitions/definitions/definition");
my $test = "";
foreach my $row ($nodelist->get_nodelist ())
{
$test = $row->find('@id');
print "$test\n";

A ten proste vypise na vystup vsechna id pro vsechny definition elementy...Takze skutecne musi byt problem nekde pri predani do promenych nebo pri ceste do databaze...

Jinak moje aktualni xml je z duvodu delky v priloze. Je u nej zmenena pripona na txt, jelikoz xml soubor neni povolen nahrat.

[attachment deleted by admin]
« Poslední změna: 05 Května 2009, 10:32:44 od Jezza »

Jezza

  • Návštěvník
  • Příspěvků: 96
Re: Perl a Xpath
« Odpověď #11 kdy: 05 Května 2009, 11:00:57 »
Tak jedna dobra zprava. Podarilo se mi to rozchodit...Napadlo me pro kazdy foreach vytvaret novy nodelist. Diky tomu jsem jiz pri tvorbe nodelistu se mohl zanorit hloubeji do stromu a pak to zacalo fungovat. Vypda to, ze zanoreni az pri pripadnem hledani konkretnich elementu/atributu nefunguje opakovane. Konkretne jsem to udelal takto:
Kód: [Vybrat]
my $xp = XML::XPath->new (filename => "def.xml");
my $nodelist = $xp->find ("/oval_definitions/definitions/definition");
foreach my $row ($nodelist->get_nodelist ())
{

# populating of definition
$dbh->do (
"INSERT INTO definition (ID_definition,title,severity,description,date) VALUES (?,?,?,?,?)",
undef,
$row->find ('@id')->string_value (),
$row->find ('metadata/title')->string_value (),
$row->find ('metadata/advisory/severity')->string_value (),
$row->find ('metadata/description')->string_value (),
$row->find ('metadata/advisory/issued/@date')->string_value ()
);
}

Velmi dekuji za pomoc jfootovi.

A zrejme brzy se ozvu s dalsimi problemy... ;D

jfoot

  • Aktivní člen
  • *
  • Příspěvků: 197
  • ..nemožné ihned, zázraky do tří dnů...
Re: Perl a Xpath
« Odpověď #12 kdy: 05 Května 2009, 11:14:06 »
Tak blahopreji, kdyz clovek zvladne problem "on his own", tak je to hodnotnejsi, nez kdyz postupuje
podle predem zaslaneneho How to...
Nicmene az budu mit trochu cas (asi nejdrive dnes okolo pulnoci, ted desive nestiham),
tak si detailneji prectu a prozkoumam v poslednich Vasich prispevcich vse co se tyka vyberu z xml stromu, kvuli vlastnimu pouceni, treba pujde neco udelat lepe.....
Pokud budete mit cokoliv dalsiho, co se tyka xpath, ci xslt, klidne dejte vedet.
Po šesté atomové válce  povrch planety Rogoz nevypadal pěkně...

Dítě nevinné...Co ty můžeš vědět...o sadomasochistické derivaci oidipovského komplexu...(O.Neff, K. Saudek, Arnal & Dva dračí zuby)

jfoot

  • Aktivní člen
  • *
  • Příspěvků: 197
  • ..nemožné ihned, zázraky do tří dnů...
Re: Perl a Xpath
« Odpověď #13 kdy: 04 Července 2009, 22:25:28 »
Zdravím Jezza,

dneska jsem zjistil, že "žijete" (viz Váš dotaz k wget) a chci se Vám omluvit : Vaše zprávy týkající se xpath
zaslané v květnu jsem díky své roztržitosti objevil na konci června . Mea culpa !!! :( :(
Pokud se Vám Váš problém s Xpath nepodařilo vyřešit, dejte mi, prosím vědět...
Po šesté atomové válce  povrch planety Rogoz nevypadal pěkně...

Dítě nevinné...Co ty můžeš vědět...o sadomasochistické derivaci oidipovského komplexu...(O.Neff, K. Saudek, Arnal & Dva dračí zuby)

 

Provoz zaštiťuje spolek OpenAlt.