Hinnavaatlus
:: Foorum
:: Uudised
:: Ärifoorumid
:: HV F1 ennustusvõistlus
:: Pangalink
:: Telekavad
:: HV toote otsing
|
|
autor |
|
brixxx
Lõuapoolik


liitunud: 04.01.2012
|
30.09.2013 22:04:52
PHP SimpleXML Reader |
|
|
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 |
|
 |
kullar
HV kasutaja

liitunud: 26.11.2006
|
01.10.2013 18:31:12
|
|
|
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 |
|
 |
gynterk
HV kasutaja
liitunud: 17.01.2004
|
01.10.2013 21:36:23
|
|
|
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:
|
<?php $src_xml = <<<XML <bookstore> <book category="COOKING"> <title lang="en">Everyday Italian</title> <author>Giada De Laurentiis</author> <year>2005</year> <price>30.00</price> </book> <book category="CHILDREN"> <title lang="en">Harry Potter</title> <author>J K. Rowling</author> <year>2005</year> <price>29.99</price> </book> <book category="WEB"> <title lang="en"><![CDATA[Learning XML]]></title> <author>Erik T. Ray</author> <year>2003</year> <price>39.95</price> </book> </bookstore> XML; $xml = simplexml_load_string($src_xml, 'SimpleXMLElement', LIBXML_NOCDATA); foreach ($xml->children() as $book) { if ($book) { printf("-> It's a book in category %s!\n", $book['category']); foreach ($book->children() as $parts) { printf(" This is node '%s' with value '%s'\n", $parts-> getName(), $parts); foreach ($parts->attributes() as $attr => $value) printf(" It has an attribute '%s' with value '%s'\n", $attr, $value); } } } ?>
|
Tagastab minul järgmist:
Spoiler 
-> It's a book in category COOKING!
This is node 'title' with value 'Everyday Italian'
It has an attribute 'lang' with value 'en'
This is node 'author' with value 'Giada De Laurentiis'
This is node 'year' with value '2005'
This is node 'price' with value '30.00'
-> It's a book in category CHILDREN!
This is node 'title' with value 'Harry Potter'
It has an attribute 'lang' with value 'en'
This is node 'author' with value 'J K. Rowling'
This is node 'year' with value '2005'
This is node 'price' with value '29.99'
-> It's a book in category WEB!
This is node 'title' with value 'Learning XML'
It has an attribute 'lang' with value 'en'
This is node 'author' with value 'Erik T. Ray'
This is node 'year' with value '2003'
This is node 'price' with value '39.95' |
|
|
Kommentaarid: 5 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
5 |
|
tagasi üles |
|
 |
napoleon
Unknown virus

liitunud: 08.12.2008
|
01.10.2013 23:42:45
|
|
|
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
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 |
|
 |
brixxx
Lõuapoolik


liitunud: 04.01.2012
|
03.10.2013 00:00:26
|
|
|
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 |
|
 |
Redikate
HV veteran

liitunud: 30.12.2005
|
03.10.2013 16:11:54
|
|
|
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 |
|
 |
brixxx
Lõuapoolik


liitunud: 04.01.2012
|
06.10.2013 01:52:24
|
|
|
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 |
|
 |
Redikate
HV veteran

liitunud: 30.12.2005
|
07.10.2013 12:23:40
|
|
|
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 |
|
 |
brixxx
Lõuapoolik


liitunud: 04.01.2012
|
09.10.2013 02:01:34
|
|
|
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 |
|
 |
Redikate
HV veteran

liitunud: 30.12.2005
|
|
Kommentaarid: 34 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
33 |
|
tagasi üles |
|
 |
brixxx
Lõuapoolik


liitunud: 04.01.2012
|
11.10.2013 02:59:54
|
|
|
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 |
|
 |
Redikate
HV veteran

liitunud: 30.12.2005
|
11.10.2013 10:58:59
|
|
|
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 |
|
 |
|