Avaleht
uus teema   vasta Tarkvara »  Programmeerimine »  XML parsing märgi kõik teemad loetuks
märgi mitteloetuks
vaata eelmist teemat :: vaata järgmist teemat
Hinnavaatlus :: Foorum :: Uudised :: Ärifoorumid :: HV F1 ennustusvõistlus :: Pangalink :: Telekavad :: HV toote otsing
autor
sõnum Saada viide sõbrale.  :: Teata moderaatorile teata moderaatorile
otsing:  
sakunne
HV veteran
sakunne

liitunud: 15.12.2004




sõnum 11.03.2012 17:48:45 XML parsing vasta tsitaadiga

Oleks XML'ist vaja kätte saada ainult teatud tingimustele vastavad elemendid, XML:
Spoiler Spoiler Spoiler

PHP
Spoiler Spoiler Spoiler
Sellega oleks vaha välja sõeluda elemendid, mille Availability=1 ja ProductGroup=nt S23 vms
Kuidas oleks 'xpath' süntaks


viimati muutis sakunne 11.03.2012 18:10:46, muudetud 1 kord
Kommentaarid: 77 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 69
tagasi üles
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
Ho Ho
HV Guru
Ho Ho

liitunud: 16.02.2002




sõnum 11.03.2012 18:02:13 vasta tsitaadiga

xpath'i pole varem pruukinud kuid 5min googeldamise tulemusena jäi mulje, et säärases formaadis "xml"'ist on pagana keerukas miskit välja võtta sellega. Xpath pigem eeldaks, et sul on asjad stiilis <item><stockcode>1</stockcode><availiability>1</availiability></item>. Foreachiga sealt <tr>'ide seest sellisel kujul info otsimine on samuti paras porno kuubis.

Kui tihti tollest XML'ist on tarvis andmeid välja otsida ning kui suured failid on? Kui fail vähegi suurem või otsingut on tarvis teha rohkem kui paar-kolm korda siis üsna kindlasti oleks mõttekam see kasvõi ajutiselt andmebaasi lükata ja seal otsas päringuid teha.

_________________
Teach a man to reason and he'll think for a lifetime
Common sense - so rare that it's a damn superpower
Vaadates paljude inimeste sõnavõtte siin ja mujal jääb üle ainult klassikuid tsiteerida - "I weep for humanity"
Kommentaarid: 106 loe/lisa Kasutajad arvavad:  :: 0 :: 1 :: 86
tagasi üles
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
sakunne
HV veteran
sakunne

liitunud: 15.12.2004




sõnum 11.03.2012 18:35:22 vasta tsitaadiga

DOM'iga ma sain nii:
<?php
$dom = new DOMDocument();
$dom->load('full_availability.xml');
$xpath = new DOMXPath($dom);
$Result = $xpath->query('//Line[ExtProdGroup="0204"]');
...
''foreach' rida, töötab:
foreach($Result as $Line)
{
   if( $Line->ExtProdGroup == '0204' && $Line->Availability != '0' )
   { ...
Tahaks veel proovida 'SimpleXML' ja 'xpath':
$Result = new SimpleXMLElement('full_availability.xml', null, true);
...
icon_rolleyes.gif
Kommentaarid: 77 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 69
tagasi üles
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
Timukas0
HV kasutaja
Timukas0

liitunud: 20.03.2007




sõnum 11.03.2012 19:43:04 vasta tsitaadiga

Midagi sellist?
$xml = new SimpleXMLElement('full_availability.xml', null, true);
$result = $xml->xpath('//Line[ExtProdGroup="0204" and Availability=1]');
Kommentaarid: 3 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 3
tagasi üles
vaata kasutaja infot saada privaatsõnum
sakunne
HV veteran
sakunne

liitunud: 15.12.2004




sõnum 11.03.2012 21:10:19 vasta tsitaadiga

Just seda oligi tarvis - mul selle 'xpath' süntaksiga raskusi icon_redface.gif
Siin on need võimalused ühe ja sama tulemuse saamiseks:
$dom = new DOMDocument();
$dom->load('full_availability.xml');
$xpath = new DOMXPath($dom);
$Result = $xpath->query('//Line[ExtProdGroup="0204"]');
$Result = new SimpleXMLElement('full_availability.xml', null, true);
... ... ... ...
foreach($Result as $Line)
{
   if( $Line->ExtProdGroup == '0204' && $Line->Availability != '0' )
   { ...
$xml = new SimpleXMLElement('full_availability.xml', null, true);
$Result = $xml->xpath('//Line[ExtProdGroup="0204" and Availability != 0 ]');
... kui kedagi peaks huvitama icon_confused.gif
Kommentaarid: 77 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 69
tagasi üles
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
nemu
HV vaatleja
nemu

liitunud: 22.01.2002



Autoriseeritud ID-kaardiga

sõnum 12.03.2012 10:46:20 vasta tsitaadiga

XSLT oleks lihtsalt esituse jaoks sobivam ?

https://foorum.hinnavaatlus.ee/viewtopic.php?p=6140448#6140448
Kommentaarid: 12 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 11
tagasi üles
vaata kasutaja infot saada privaatsõnum
matis
HV kasutaja
matis

liitunud: 12.04.2004




sõnum 12.03.2012 11:33:33 vasta tsitaadiga

Kui Zend on projektis saada, siis võid kasutada nii:


$assoc_array = Zend_Json::decode(Zend_Json::fromXml($inputXml));

http://framework.zend.com/manual/en/zend.json.xml2json.html

_________________
https://www.e-abi.ee/ - Pangalingid, Smartposti, Post24 moodulid, Järelmaksumoodulid. Magento, Prestahop, Wordpress. Aktsepteerin Bitcoini!
Soovid lisada oma tooteid HinnaVaatlusesse? https://www.e-abi.ee/magento/kasulikud/product-exporter-and-multi-product-feed-generator-hinnavaatlus.html
Kommentaarid: 64 loe/lisa Kasutajad arvavad:  :: 1 :: 1 :: 60
tagasi üles
vaata kasutaja infot saada privaatsõnum
sakunne
HV veteran
sakunne

liitunud: 15.12.2004




sõnum 26.03.2012 12:38:53 vasta tsitaadiga

Kasutasin seda varianti:
$xml = new SimpleXMLElement('full_availability.xml', null, true);
$Result = $xml->xpath('//Line[ExtProdGroup="0204" and Availability != 0 ]');
Nüüd oleks vaja saada teisest .xml failist 'Hind', siduda nad omavahel tootekoodi alusel ja siis selle järgi sorteerida.
Kommentaarid: 77 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 69
tagasi üles
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
Ho Ho
HV Guru
Ho Ho

liitunud: 16.02.2002




sõnum 26.03.2012 12:54:12 vasta tsitaadiga

Sääraste sidumise-sortimise puhul tahaks kohe väga teada mis hea põhjus sul küll olla võib et sa tahad andmebaasi asemel xml'i kasutada icon_smile.gif

Igatahes säärase sidumise pead sa xml'is minu teada täiesti käsitsi tegema ühekaupa asju läbi käies mis on igatepidi ebaefektiivne.

_________________
Teach a man to reason and he'll think for a lifetime
Common sense - so rare that it's a damn superpower
Vaadates paljude inimeste sõnavõtte siin ja mujal jääb üle ainult klassikuid tsiteerida - "I weep for humanity"
Kommentaarid: 106 loe/lisa Kasutajad arvavad:  :: 0 :: 1 :: 86
tagasi üles
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
DoS
HV veteran
DoS

liitunud: 19.08.2002




sõnum 26.03.2012 13:07:40 vasta tsitaadiga

Ho Ho kirjutas:
Sääraste sidumise-sortimise puhul tahaks kohe väga teada mis hea põhjus sul küll olla võib et sa tahad andmebaasi asemel xml'i kasutada icon_smile.gif

Igatahes säärase sidumise pead sa xml'is minu teada täiesti käsitsi tegema ühekaupa asju läbi käies mis on igatepidi ebaefektiivne.

http://www.w3schools.com/xquery/default.asp on selle jaoks täiesti olemas
Kommentaarid: 50 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 47
tagasi üles
vaata kasutaja infot saada privaatsõnum
sakunne
HV veteran
sakunne

liitunud: 15.12.2004




sõnum 26.03.2012 13:32:40 vasta tsitaadiga

Ho Ho kirjutas:
Sääraste sidumise-sortimise puhul tahaks kohe väga teada mis hea põhjus sul küll olla võib et sa tahad andmebaasi asemel xml'i kasutada icon_smile.gif
Põhjus lihtne - ma ei saa andmebaasile ligi - see on osa suurest laosüsteemist ... niiet ... Kõiksuse Looja, anna mulle jõudu leppida asjadega, mida muuta ei saa
$xml = new SimpleXMLElement('full_availability_3.xml', null, true);
$xml_price = new SimpleXMLElement('price.xml', null, true);
$Result = $xml->xpath('//Line[ExtProdGroup="0204" and Availability != 0 ]');
Kui siin see 'Result' nüüd vastavalt vormistada, saaks ehk asja käima icon_rolleyes.gif
Kommentaarid: 77 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 69
tagasi üles
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
Ho Ho
HV Guru
Ho Ho

liitunud: 16.02.2002




sõnum 26.03.2012 13:47:48 vasta tsitaadiga

sakunne kirjutas:
Ho Ho kirjutas:
Sääraste sidumise-sortimise puhul tahaks kohe väga teada mis hea põhjus sul küll olla võib et sa tahad andmebaasi asemel xml'i kasutada icon_smile.gif
Põhjus lihtne - ma ei saa andmebaasile ligi - see on osa suurest laosüsteemist ... niiet ... Kõiksuse Looja, anna mulle jõudu leppida asjadega, mida muuta ei saa
Kui mõeldamatu on teha (ajutine) kohalik andmebaas? Kasvõi sqlite'i oma. Kui andmehulk vähegi suuremaks läheb siis säärane XML'i otsa ehitatud pornograafia saab olema väga valus. Endal ka praegu ühe süsteemi arendamine pooleli kus üritatakse XML'i andmebaasina kasutada, vääääga valus icon_smile.gif
_________________
Teach a man to reason and he'll think for a lifetime
Common sense - so rare that it's a damn superpower
Vaadates paljude inimeste sõnavõtte siin ja mujal jääb üle ainult klassikuid tsiteerida - "I weep for humanity"
Kommentaarid: 106 loe/lisa Kasutajad arvavad:  :: 0 :: 1 :: 86
tagasi üles
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
DoS
HV veteran
DoS

liitunud: 19.08.2002




sõnum 26.03.2012 15:29:05 vasta tsitaadiga

Ho Ho kirjutas:
sakunne kirjutas:
Ho Ho kirjutas:
Sääraste sidumise-sortimise puhul tahaks kohe väga teada mis hea põhjus sul küll olla võib et sa tahad andmebaasi asemel xml'i kasutada icon_smile.gif
Põhjus lihtne - ma ei saa andmebaasile ligi - see on osa suurest laosüsteemist ... niiet ... Kõiksuse Looja, anna mulle jõudu leppida asjadega, mida muuta ei saa
Kui mõeldamatu on teha (ajutine) kohalik andmebaas? Kasvõi sqlite'i oma. Kui andmehulk vähegi suuremaks läheb siis säärane XML'i otsa ehitatud pornograafia saab olema väga valus. Endal ka praegu ühe süsteemi arendamine pooleli kus üritatakse XML'i andmebaasina kasutada, vääääga valus icon_smile.gif


Kui asju nii teha
Ho Ho kirjutas:
Igatahes säärase sidumise pead sa xml'is minu teada täiesti käsitsi tegema ühekaupa asju läbi käies mis on igatepidi ebaefektiivne.

siis loogiline, et asi valusaks muutub. Kui on reaalne vajadus XML baasi järgi (mitte lihtsalt et nalja pärast asendame RDBMSi XML'ga), siis on asi igati omal kohal ja sel juhul hakata seda päringute tegemiseks relatsiooniliseks teisendama on veelgi valusam, kui mitte suisa pornograafia.
Kommentaarid: 50 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 47
tagasi üles
vaata kasutaja infot saada privaatsõnum
sakunne
HV veteran
sakunne

liitunud: 15.12.2004




sõnum 26.03.2012 16:18:00 vasta tsitaadiga

Päris relatsiooniliseks asi ehk ei lähe:

$xml = new SimpleXMLElement('full_availability.xml', null, true);
$xml_price = new SimpleXMLElement('price.xml', null, true);
$Result = $xml->xpath('//Line[ExtProdGroup="0204" and Availability != 0 ]');

Esimesest failist valida read, mis vastavad : [ExtProdGroup="0204" and Availability != 0 ] ja siis failist 'price.xml' sama koodiga toodete hinnad ('kood' väli on mõlemal ühine)
Kommentaarid: 77 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 69
tagasi üles
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
Ho Ho
HV Guru
Ho Ho

liitunud: 16.02.2002




sõnum 26.03.2012 16:22:14 vasta tsitaadiga

Juba üsna teema alguses küsisin (kuid vastuseta jäin), et kui tihti samu andmeid töödeldakse. Kui tõesti on andmed vaja ainult korra läbi töötada siis jah ei oma see erilist mõtet, kui paar-kolm korda või rohkem siis juba hakkaks üsna tõsiselt baasiks teisendamise peale mõtlema.
_________________
Teach a man to reason and he'll think for a lifetime
Common sense - so rare that it's a damn superpower
Vaadates paljude inimeste sõnavõtte siin ja mujal jääb üle ainult klassikuid tsiteerida - "I weep for humanity"
Kommentaarid: 106 loe/lisa Kasutajad arvavad:  :: 0 :: 1 :: 86
tagasi üles
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
sakunne
HV veteran
sakunne

liitunud: 15.12.2004




sõnum 26.03.2012 16:33:05 vasta tsitaadiga

Ho Ho kirjutas:
Juba üsna teema alguses küsisin (kuid vastuseta jäin), et kui tihti samu andmeid töödeldakse. Kui tõesti on andmed vaja ainult korra läbi töötada siis jah ei oma see erilist mõtet, kui paar-kolm korda või rohkem siis juba hakkaks üsna tõsiselt baasiks teisendamise peale mõtlema.

2x tunnis
A'kas selline päring on xml puhul siis nii keeruline icon_eek.gif
Kommentaarid: 77 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 69
tagasi üles
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
Ho Ho
HV Guru
Ho Ho

liitunud: 16.02.2002




sõnum 26.03.2012 16:57:13 vasta tsitaadiga

Sõltub kui suurtest andmehulkadest jutt käib. Ise tegin lihtsamaid "päringuid" üle paari megase XML'i ning ega see eriti hästi jõudlusele ei mõjunud.
_________________
Teach a man to reason and he'll think for a lifetime
Common sense - so rare that it's a damn superpower
Vaadates paljude inimeste sõnavõtte siin ja mujal jääb üle ainult klassikuid tsiteerida - "I weep for humanity"
Kommentaarid: 106 loe/lisa Kasutajad arvavad:  :: 0 :: 1 :: 86
tagasi üles
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
sakunne
HV veteran
sakunne

liitunud: 15.12.2004




sõnum 26.03.2012 19:56:52 vasta tsitaadiga

Mõlemad failid on kuskil <5 MB veidi alla 39k rea
Selline parsib päris kähku

$xml = new SimpleXMLElement('full_availability.xml', null, true);
$Result = $xml->xpath('//Line[ExtProdGroup="0204" and Availability != 0 ]');


Samuti see:

$xml_price = new SimpleXMLElement('price.xml', null, true);
$Result2 = $xml_price->xpath('//Line[StockCode <= 499999]');


Kuidas neid kokku panna ... vat see on küsimus beer_yum.gif
Kommentaarid: 77 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 69
tagasi üles
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
DoS
HV veteran
DoS

liitunud: 19.08.2002




sõnum 26.03.2012 22:03:09 vasta tsitaadiga

sakunne kirjutas:

Kuidas neid kokku panna ... vat see on küsimus beer_yum.gif

http://www.zorba-xquery.com/html/index
Kommentaarid: 50 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 47
tagasi üles
vaata kasutaja infot saada privaatsõnum
nemu
HV vaatleja
nemu

liitunud: 22.01.2002



Autoriseeritud ID-kaardiga

sõnum 26.03.2012 23:43:47 vasta tsitaadiga

php:
  1.  
  2. $list = array();
  3.  
  4. $xml = simplexml_load_file('result.xml');
  5.  
  6. foreach ( $xml->xpath('//Line[ExtProdGroup="0204" and Availability != 0 ]') as $r)
  7. {
  8.   $code = (string)$r->StockCode;
  9.  
  10.   $list[$code] = array(
  11.     'stockcode' => $code,
  12.     'description' => (string)$r->Description,
  13.   );
  14. }
  15.  
  16. $xml = simplexml_load_file('prices.xml');
  17.  
  18. foreach ($xml->xpath('//Line[StockCode <= 499999]') as $r)
  19. {
  20.   $code = (string)$r->StockCode;
  21.   if (!isset($list[$code])) continue;
  22.   $list[$code]['price'] = (string)$r->Price;
  23. }
  24.  
Kommentaarid: 12 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 11
tagasi üles
vaata kasutaja infot saada privaatsõnum
andresv
HV kasutaja

liitunud: 06.12.2004



Autoriseeritud ID-kaardiga

sõnum 28.03.2012 10:40:56 vasta tsitaadiga

kui mu mälu mind ei peta, siis "//" kasutamine xpathi alguses on väga ebaeffektiivne, seega kui võimalik tuleks seal full path-i kasutada: "/Result/Line"
Kommentaarid: 5 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 5
tagasi üles
vaata kasutaja infot saada privaatsõnum
sakunne
HV veteran
sakunne

liitunud: 15.12.2004




sõnum 30.03.2012 13:53:18 vasta tsitaadiga

andresv kirjutas:
kui mu mälu mind ei peta, siis "//" kasutamine xpathi alguses on väga ebaeffektiivne, seega kui võimalik tuleks seal full path-i kasutada: "/Result/Line"

Võtan arvesse thumbs_up.gif

nemu kirjutas:
php:
  1.  
  2. $list = array();
  3.  
  4. $xml = simplexml_load_file('result.xml');
  5.  
  6. foreach ( $xml->xpath('//Line[ExtProdGroup="0204" and Availability != 0 ]') as $r)
  7. {
  8.   $code = (string)$r->StockCode;
  9.  
  10.   $list[$code] = array(
  11.     'stockcode' => $code,
  12.     'description' => (string)$r->Description,
  13.   );
  14. }
  15.  
  16. $xml = simplexml_load_file('prices.xml');
  17.  
  18. foreach ($xml->xpath('//Line[StockCode <= 499999]') as $r)
  19. {
  20.   $code = (string)$r->StockCode;
  21.   if (!isset($list[$code])) continue;
  22.   $list[$code]['price'] = (string)$r->Price;
  23. }
  24.  

Mul õnnestus saada ligipääs sinna, kus neid .xml faile tekitatakse - seega teen oma vajadustele vastava .ml fili, ning kaob vajadus mööda mitut .xml'i sobrada, tänud igatahes beer_yum.gif

Kuidas väljundit sorteerida icon_rolleyes.gif
Kommentaarid: 77 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 69
tagasi üles
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
andresv
HV kasutaja

liitunud: 06.12.2004



Autoriseeritud ID-kaardiga

sõnum 30.03.2012 15:56:32 vasta tsitaadiga

midagi sellist näiteks
php:
  1.  
  2. uasort($list, function ($item1, $item2) {
  3.     if ($item1['price'] ==  $item2['price']) {
  4.         return 0;
  5.     }
  6.     return ($item1['price']$item2['price']) ? -1 : 1;
  7. });
  8.  

võrdema peaksid siis ikka hindu numbri kujul mitte tekstina
Kommentaarid: 5 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 5
tagasi üles
vaata kasutaja infot saada privaatsõnum
näita postitusi alates eelmisest:   
uus teema   vasta Tarkvara »  Programmeerimine »  XML parsing
[vaata eelmist teemat] [vaata järgmist teemat]
 lisa lemmikuks
näita foorumit:  
 ignoreeri teemat 
sa ei või postitada uusi teemasid siia foorumisse
sa ei või vastata selle foorumi teemadele
sa ei või muuta oma postitusi selles foorumis
sa ei või kustutada oma postitusi selles foorumis
sa ei või vastata küsitlustele selles foorumis
sa ei saa lisada manuseid selles foorumis
sa võid manuseid alla laadida selles foorumis



Hinnavaatlus ei vastuta foorumis tehtud postituste eest.