Avaleht
uus teema   vasta Tarkvara »  Programmeerimine »  PHP SimpleXML Reader 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:  
brixxx
Lõuapoolik
Lõuapoolik
brixxx

liitunud: 04.01.2012




sõnum 30.09.2013 22:04:52 PHP SimpleXML Reader vasta tsitaadiga

Hetkel tegelen ühe XML file lugemise programmeerimisega, kasutan selleks SimpleXML. Olen hetkel toppama jäänud, et saan kätte atribuudi väärtuse või kasutan XML kuvamiseks print_r. Mul oleks peale atribuudi väärtuse vaja kätte saada ka sama elemendi väärtus, kus olen saanud atribuudi väärtuse kätte.

Hetkel olen nii palju jõudnud programmeerida:

<?php

$url = "http://88.196.48.87:8888/solr/select?q=*:*&rows=20&wt=xml&indent=true";
$xml = simplexml_load_file($url);

foreach ($xml->children() as $result) {

  foreach ($result->children() as $doc) {
 
    //print $doc->str['name']."<br/>";
    $arr = $doc->arr['name'];
    print $arr . "<br/>";
   
  }

}

/*$doc = $xml->result->doc;

print "<pre>";
print_r($doc);*/

?>
tagasi üles
vaata kasutaja infot saada privaatsõnum
kullar
HV kasutaja
kullar

liitunud: 26.11.2006



Autoriseeritud ID-kaardiga

sõnum 01.10.2013 18:31:12 vasta tsitaadiga

Ma olen endal vahepeal objekti arrayks teinud:

$_objXML = simplexml_load_file($_strXmlPath, 'SimpleXMLElement', LIBXML_NOCDATA); // Siin teine ja kolmas argument lubavad ka CDATA väärtusi parsida
$_arrXML = json_decode(json_encode((array)$_objXML), 1);


sel juhul on XML array ja saab arrayna läbi parsida ja ei pea objektidega jändama.
print_r($_arrXML);

_________________
Online Perekonna Eelarve, Keerukamad veebipõhised infosüsteemid jms
Kommentaarid: 27 loe/lisa Kasutajad arvavad:  :: 0 :: 1 :: 25
tagasi üles
vaata kasutaja infot saada privaatsõnum
gynterk
HV kasutaja

liitunud: 17.01.2004




sõnum 01.10.2013 21:36:23 vasta tsitaadiga

Ma küll ei saanud Su selgitusest aru, et mida Sa täpselt tahad kätte saada, aga ehk on allpool olevast näitest abi:

php:
  1. <?php
  2.  
  3. $src_xml = <<<XML
  4. <bookstore>
  5.     <book category="COOKING">
  6.         <title lang="en">Everyday Italian</title>
  7.         <author>Giada De Laurentiis</author>
  8.         <year>2005</year>
  9.         <price>30.00</price>
  10.     </book>
  11.     <book category="CHILDREN">
  12.         <title lang="en">Harry Potter</title>
  13.         <author>J K. Rowling</author>
  14.         <year>2005</year>
  15.         <price>29.99</price>
  16.     </book>
  17.     <book category="WEB">
  18.         <title lang="en"><![CDATA[Learning XML]]></title>
  19.         <author>Erik T. Ray</author>
  20.         <year>2003</year>
  21.         <price>39.95</price>
  22.     </book>
  23. </bookstore>
  24. XML;
  25.  
  26. $xml = simplexml_load_string($src_xml, 'SimpleXMLElement', LIBXML_NOCDATA);
  27. foreach ($xml->children() as $book) {
  28.     if ($book) {
  29.         printf("-> It's a book in category %s!\n", $book['category']);
  30.         foreach ($book->children() as $parts) {
  31.             printf("     This is node '%s' with value '%s'\n", $parts->getName(), $parts);
  32.             foreach ($parts->attributes() as $attr => $value)
  33.                 printf("       It has an attribute '%s' with value '%s'\n", $attr, $value);
  34.         }
  35.     }
  36. }
  37. ?>


Tagastab minul järgmist:
Spoiler Spoiler Spoiler
Kommentaarid: 5 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 5
tagasi üles
vaata kasutaja infot saada privaatsõnum
napoleon
Unknown virus
napoleon

liitunud: 08.12.2008



Autoriseeritud ID-kaardiga

sõnum 01.10.2013 23:42:45 vasta tsitaadiga

Ei ole mõtet vaeva näha. Viimane näide oleks nagu vastus, aga küsija otsib kala mitte õnge ja paraku pole ta isegi seda öelnud, millist kala püüda üritab icon_wink.gif
Aga juhuks kui teemaalgataja vahepeal end harinud on, annan siiski lingi, mis küsimustele vastuse peaks andma http://ee1.php.net/manual/en/class.simplexmlelement.php või kui mitte seda, siis vähemalt baasi mille pealt asjalikumaid küsimusi esitada
Kommentaarid: 77 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 60
tagasi üles
vaata kasutaja infot saada privaatsõnum
brixxx
Lõuapoolik
Lõuapoolik
brixxx

liitunud: 04.01.2012




sõnum 03.10.2013 00:00:26 vasta tsitaadiga

Nüüd ma olen veidi rohkem teada saanud SimpleXML Readerist. Aga probleem on endine. Mul oleks vaja kätte saada pealkiri, sisu ja kategooria. XML asub http://88.196.48.87:8888/solr/select?q=*:*&rows=20&wt=xml&indent=true.

Kategooria saan kätte juba, aga probleem on selles, et mõnel teemal on mitu kategooriat, aga sel juhul näitab kõige esimest kategooria nimetust. Hetkel kood selline.

<?php

$url = "http://88.196.48.87:8888/solr/select?q=*:*&rows=20&wt=xml&indent=true";
$xml = simplexml_load_file($url);

foreach ($xml->children() as $result) {

  foreach ($result->children() as $doc) {
 
     print "Category: ".$doc->arr->str."<br/>";
   
  }
 
}

?>

Suurem probleem on mul pealkirja ja sisu kätte saamisega. Hetkel olen atribuutide nimega kontrollinud, kas loeb õigeid elemente. Kuna selles XMLis on väga palju <str> elemente ning erinevad ainult atribuudi väärtuse poolest, aga atribuudi nimi kõikidel <str> elemenditel 'name'. Aga hetkel väljastab ainult <str> elemente, mille atribuudi väärtus on 'intend' ja 'author'. Kuidas kätte saada <str>, mille atribuudi väärtus on 'title' ja 'description'.

<?php

$url = "http://88.196.48.87:8888/solr/select?q=*:*&rows=20&wt=xml&indent=true";
$xml = simplexml_load_file($url);

print $xml->getName()."<br/>";
print "<br/>";

foreach ($xml->children() as $result) {

  foreach ($result->children() as $doc) {
 
    print $doc->str->getName()." - ".$doc->str['name']."<br/>";
 
  }

}

?>
tagasi üles
vaata kasutaja infot saada privaatsõnum
Redikate
HV veteran
Redikate

liitunud: 30.12.2005




sõnum 03.10.2013 16:11:54 vasta tsitaadiga

Toimiv kood mis prindib välja authori, title ja kõik kategooriad. Pane tähele kolmandad foreach mis loobib läbi kõik <doc>'i str'd. Sinu kood loopis ainult docid läbi ja printis igast ühest esimese str.

<?php

$url = "http://88.196.48.87:8888/solr/select?q=*:*&rows=20&wt=xml&indent=true";
$xml = simplexml_load_file($url);

$nl = '<br />';

print $xml->getName() . $nl;
print $nl;

foreach ($xml->children() as $result) {

  foreach ($result->children() as $doc) {
     
   foreach($doc as $str) {   
      switch($str['name']) {
         case "title":
            print "Title: ". $str ." ". $nl;
         break;
         case "author":
            print "Author: ". $str ." ". $nl;
         break;
         case "category":
            print "Categories: ";
            foreach($str as $category) {
               print $category .',';
            }   
            print $nl;
         break;
      }
     }
  }

}

?>

_________________
http://nodejs.org/
"I'm also a person. Programming is just one thing I do."
Kommentaarid: 34 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 33
tagasi üles
vaata kasutaja infot saada privaatsõnum
brixxx
Lõuapoolik
Lõuapoolik
brixxx

liitunud: 04.01.2012




sõnum 06.10.2013 01:52:24 vasta tsitaadiga

Eelmine vastus aitas palju edasi. Aga olen hetkel kaks õhtud jändanud xpathiga, hetkel otsin xpathiga kategooriat, ma leian kategooria, aga kuidas saaksin kuvada kategooria alla kuuluva pealkirja ja sisu. Nii palju olen hetkel loogiliselt mõelnud, et kui kirjutan xpathi ning siis foreachi, siis väljastab kategooria, aga pealkirja ja sisu väljastamiseks tuleks astuda üks samm elemendist tagasi. Probleem on ka see, et kui otsin kategooriat, kus on mitu nimetust, siis kuvab kategooria esimese nimetuse, aga see probleem ei ole väga priorteetne kuna programm kuvaks ainult pealkirja ja sisu. Kood hetkel selline.

<?php

$url = "http://88.196.48.87:8888/solr/select?q=*:*&rows=20&wt=xml&indent=true";
$xml = simplexml_load_file($url);

$nl = "<br/>";

$clouds = $xml->xpath('//arr[str="dell"]');

foreach ($clouds as $cloud) {

  print "<b>Category: </b>".$cloud->str.$nl;

}
?>


Hetkel olen peaaegu valmis saanud programmi, mis väljastab 4 viimast uudise kuupäeva. Mul hetkel väljastab 4 viimast uudise kuupäeva, aga annab ka veateate 'Warning: main(): Cannot add element doc number 1 when only 0 such elements exist in C:\Users\Dell\Documents\xampp\htdocs\projektid\news\positsion_1.php on line 31' ning ma ei oska enda koodis midagi enam muuta, mis vea ära võtaks.

Kood:

<?php

$url = "http://88.196.48.87:8888/solr/select?q=*:*&rows=20&wt=xml&indent=true";
$xml = simplexml_load_file($url);

$nl = "<br/>";

$dates = array();
$n = 0;

foreach ($xml->result as $result) {

  foreach ($result->doc as $doc) {
   
      $dates[] = $doc;
 
  }

}

usort($dates, function ($a, $b) {

  return strtotime($a->date)<strtotime($b->date);
 
});

foreach ($dates as $date) {

  if (++$n <= 4) {

    print "<b>Date: </b>".$date[$n]->date.$nl;
 
  }
 
}

?>
tagasi üles
vaata kasutaja infot saada privaatsõnum
Redikate
HV veteran
Redikate

liitunud: 30.12.2005




sõnum 07.10.2013 12:23:40 vasta tsitaadiga

Uuh...mingi maagia on sul...

Esiteks, kui sa tahad 4 viimase uudise kuupäevi, siis muuda oma XML'i allikat. Antud allikas lubab kenasti sortida kahanevalt kuupäeva järgi samas näidates ainult 4 tulemust.
Saamegi uue allika (märkisin muudatused ära boldis, ole urli copides ettevaatlik):
http://88.196.48.87:8888/solr/select?q=*:*&rows=4&wt=xml&indent=true&sort=date%20desc

Mis toob meid selleni, et sinu algne XML'i allikas tegelikult näitab mingeid suva hetke uudiseid ja nende 20 uudise seas mida ta näitab, pole viimaseid üldse olemas. Seega kui sa tahad viimast 20'net uudist, siis:
http://88.196.48.87:8888/solr/select?q=*:*&rows=20&wt=xml&indent=true&sort=date%20desc

Kui sa nüüd koodi mõttes mõtled, et mismoodi saab X objectist 4 viimast elementi. Siis siin on sulle näide algse allika toel. Antud kood näitab siis viimase 4 uudise kuupäeva:


<?php

$url = "http://88.196.48.87:8888/solr/select?q=*:*&rows=20&wt=xml&indent=true";
$xml = simplexml_load_file($url);

$nl = "<br/>";
$i = 0;

foreach ($xml->result as $result) {
  // result on siin võrdne objectiga'ga kus on kõik docid mis on <result></result> sees xml'is

  foreach ($result->children() as $doc) {
    // iga doc on omakorda siin võrdne objectiga kus on kõik elemendid mis on <doc></doc> sees
    foreach($doc as $str) {
      // prindime 4 viimase uudise ajad. (string) cast on sellepärast, et str on simpleXMLelement object mitte string
      // strtotime muudab selle stringi date jaoks timestampiks
      if($str['name'] == "date" && $i >= count($result)-4) {
        print date('d-m-Y', strtotime((string)$str)) . $nl;
      }

     
    }
    $i++;
  }   
}

?>


Kui sa tahad näidata neid kuupäevi reverse orderis, siis pane nad arraysse ning siis kasuta array_reverse(). Või lihtsalt kasuta õiget allikat XML'i jaoks.

_________________
http://nodejs.org/
"I'm also a person. Programming is just one thing I do."
Kommentaarid: 34 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 33
tagasi üles
vaata kasutaja infot saada privaatsõnum
brixxx
Lõuapoolik
Lõuapoolik
brixxx

liitunud: 04.01.2012




sõnum 09.10.2013 02:01:34 vasta tsitaadiga

Tänan vastuse eest, tegelikult mul on viimase 4 uudise kuvamine lahendatud.

Aga hetkel ainuke probleem on, et kuidas saada kätte pealkiri ja sisu, kui otsin kategooria järgi. Kui oleks kategooria ja pealkiri, sisu samal tasemel, siis ilmselt suudaks lahentada probleemi. Kuid kategooria on tasemel '<xml><result><doc><arr><str></str></arr></doc></result></xml>', aga pealkiri ja sisu on madalal tasemel '<xml><result><doc><str></str></doc></result></xml>'. Probleem ongi hetkel, kuidas saada madalamale tasemele, et kuvada pealkiri ja kategooria.

Hetkel selline kood:

<?php

$url = "http://88.196.48.87:8888/solr/select?q=*:*&rows=20&wt=xml&indent=true";
$xml = simplexml_load_file($url);

$nl = "<br/>";

$clouds = $xml->xpath('//arr[str="dell"]');

foreach ($clouds as $cloud) {

  print $cloud->str.$nl;
 
  foreach ($cloud as $str) {
   
      switch ($str['name']) {
     
        case "title":
          print "<b>Title: </b>".$str." ".$nl;
        break;
        case "description":
          print "<b>Description: </b>".$str." ".$nl;
        break;
        case "category":
          print "<b>Categories: </b>";
          foreach ($str as $category) {
            print $category.", ";
          }
          print "<p/>";
        break;
     
      }
 
  }

}

?>
tagasi üles
vaata kasutaja infot saada privaatsõnum
Redikate
HV veteran
Redikate

liitunud: 30.12.2005




sõnum 10.10.2013 01:21:20 vasta tsitaadiga

Tegelt sa võiks ise natuke rohkem süveneda PHP SimpleXML'i ning lugeda seda http://www.php.net/manual/en/simplexmlelement.xpath.php

Sest eelmisele probleemile on ääretult kerge fix:
$clouds = $xml->xpath('//arr[str="dell"]/parent::*');

_________________
http://nodejs.org/
"I'm also a person. Programming is just one thing I do."
Kommentaarid: 34 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 33
tagasi üles
vaata kasutaja infot saada privaatsõnum
brixxx
Lõuapoolik
Lõuapoolik
brixxx

liitunud: 04.01.2012




sõnum 11.10.2013 02:59:54 vasta tsitaadiga

Redikate kirjutas:
Tegelt sa võiks ise natuke rohkem süveneda PHP SimpleXML'i ning lugeda seda http://www.php.net/manual/en/simplexmlelement.xpath.php

Sest eelmisele probleemile on ääretult kerge fix:
$clouds = $xml->xpath('//arr[str="dell"]/parent::*');

Tänan abi eest. Nüüd pean veidi veel uurima, kuidas kõik see kood functionis tööle saada. Olen tükk aega uurinud, millegi tõttu kui returni kasutan, siis kas annab vea või ei kuva midagi.

Olen siiani tegelenud sellega, et panna kood funktsiooni, aga see kuidagi ei õnnestu, annab, kas vea või ei kuva midagi. Selles koodis olen mitu erinevat returni varianti proovinud. Küll enne 'break' return, 'print' asemel return, aga hetkel olen returni lõppu jätnud ning kuvab valge lehe.

<?php

include "xml_url.php";

function SearchCloudNews() {

$nl = "<br/>";

$clouds = $xml->xpath('//arr[str="Cloud"]/parent::*');

foreach ($clouds as $cloud) {
 
   foreach ($cloud as $str) {
   
       switch ($str['name']) {
     
        case "title":
          print "<b>Title: </b>".$str." ".$nl;
        break;
        case "description":
          print "<b>Description: </b>".$str." ".$nl;
        break;
        case "category":
          print "<b>Categories: </b>";
          foreach ($str as $category) {
            print $category.", ";
          }
          print "<p/>";
        break;
     
      }
 
  }
 
  }
 
  return;

}

?>
tagasi üles
vaata kasutaja infot saada privaatsõnum
Redikate
HV veteran
Redikate

liitunud: 30.12.2005




sõnum 11.10.2013 10:58:59 vasta tsitaadiga

Kui sa midagi ei returni, siis ta ei peagi midagi ju returnima.
return; ei returni midagi vaid lõpetab lihtsalt funktsiooni ära (kood enam edasi ei lähe).

Samuti ei tee see funktsioon ise-enesest midagi, vaid sa pead seda reaalselt välja kutsuma kuskilt.


<?php


function xmlSearch($otsing) {
  $url = "http://88.196.48.87:8888/solr/select?q=*:*&rows=20&wt=xml&indent=true";
  $xml = simplexml_load_file($url);

  $nl = "<br/>";
  $output = "";
  $clouds = $xml->xpath('//arr[str="'. $otsing .'"]/parent::*');

  foreach ($clouds as $cloud) {

    $output .= $cloud->str.$nl;
   
    foreach ($cloud as $str) {
     
        switch ($str['name']) {
                 
          case "title":
            $output .= "<b>Title: </b>".$str." ".$nl;
          break;
          case "description":
            $output .= "<b>Description: </b>".$str." ".$nl;
          break;
          case "category":
            $output .= "<b>Categories: </b>";
            foreach ($str as $category) {
              $output .= $category.", ";
            }
            $output .= "<p/>";
          break;
       
        }
   
    }

  }

  // returnime $outputi
  return $output;

}


// kala on nüüd väärtusegs $output;
$kala = xmlSearch("dell");

print $mingiMuutuja;


?>

_________________
http://nodejs.org/
"I'm also a person. Programming is just one thing I do."
Kommentaarid: 34 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 33
tagasi üles
vaata kasutaja infot saada privaatsõnum
näita postitusi alates eelmisest:   
uus teema   vasta Tarkvara »  Programmeerimine »  PHP SimpleXML Reader
[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.