| Autor | Zpráva | ||
|---|---|---|---|
| gardener Profil |
Zdravim, zkousim si napsat jedoduchou mobilni aplikaci ale mam trochu problem s parsovanim nekterych hodnot z XML.
Pokud vyhledavam podle IC: wwwinfo.mfcr.cz/cgi-bin/ares/darv_std.cgi?ico=27074358 Zasilam request pomoci Ajaxu a v PHP parsuji nasledovne: if(!empty($ico)&&is_numeric($ico))
{
define('ARES','http://wwwinfo.mfcr.cz/cgi-bin/ares/darv_bas.cgi?ico=');
$file = @file_get_contents(ARES.$ico);
if ($file) $xml = @simplexml_load_string($file);
$a = array();
if ($xml) {
$ns = $xml->getDocNamespaces();
$data = $xml->children($ns['are']);
$el = $data->children($ns['D'])->VBAS;
if (strval($el->ICO) == $ico) {
$a['ico'] = strval($el->ICO);
$a['dic'] = strval($el->DIC);
$a['firma'] = strval($el->OF);
$a['ulice'] = strval($el->AA->NU).' '.strval($el->AA->CO);
$a['mesto'] = strval($el->AA->N);
$a['psc'] = strval($el->AA->PSC);
$a['stav'] = 'ok';
} else
$a['stav'] = 'IC firmy nebylo nalezeno';
} else
$a['stav'] = 'Databáze ARES nenà dostupná';
echo json_encode($a);
}Problem je ale kdyz Vyhledvam podle obchodnicho jmena..to mi take vrati XML, ktery bych pak rad dal vypisoval ale zde mi z nej nejde nic vydolovat: Odkaz: wwwinfo.mfcr.cz/cgi-bin/ares/ares_es.cgi?xml=1&obch_jm=Jan%20Novak if(!empty($obchodni_jm))
{
define('ARES','http://wwwinfo.mfcr.cz/cgi-bin/ares/darv_bas.cgi?obch_jm=');
$file = @file_get_contents(ARES.$obchodni_jm);
if ($file) $xml = @simplexml_load_string($file);
$a = array();
if ($xml) {
$ns = $xml->getDocNamespaces();
$data = $xml->children($ns['are']);
$el = $data->children($ns['S'])->VBAS;
if (strval($el->ICO) == $obchodni_jm) {
$a['ico'] = strval($el->ICO);
$a['jmeno'] = strval($el->ojm);
$a['firma'] = strval($el->jmn);
$a['stav'] = 'ok';
} else
$a['stav'] = 'IC firmy nebylo nalezeno';
} else
$a['stav'] = 'Databáze ARES nenà dostupná';
echo json_encode($a);
}Hlavne netusim jak nacist cely node tech zaznamu (oproti vyhledavani podle IC jich muze byt vraceno vice) a vratit ti tak abychom to pomhl pomoci Json zpracovat uz dal. Kdyby nekdo tusil jak toto vyresit budu moc vdecny za kazdou radu. |
||
| YoSarin Profil |
#2 · Zasláno: 31. 5. 2011, 23:56:24 · Upravil/a: YoSarin
gardener:
Oprav prosímtě ten druhý odkaz ať neukazuje na www.example.com... A jestli jsi na to koukal, tak druhý odkaz neobsahuje téměř žádné konkrétní informace (kromě obchodního názvu, ares identifikátoru, adresy a občas IČa), tak není divu že to z něj nemůžeš vyparsovat... edit: Navíc koukám, že url u problematického příkladu se liší - první (ta co odkazuje na example.com) vrací seznam všech Janů Nováků, druhá (ta co je v kódu) vrací chybu |
||
| gardener Profil |
#3 · Zasláno: 1. 6. 2011, 00:03:15
Opraveno, pardon. Pokud bych ale vypisoval jen ty s IC, coz je vetsina, tak na to IC mohu dat vpodstate akci na overeni IC (k tomu abych zjistil detaily), druha fce ma primarne slouzit k tomu aby kdyz nekde chce zjistit jestli nejaky novak je treba z Aše, tak se koukne a hned to muze videt..
|
||
| YoSarin Profil |
#4 · Zasláno: 1. 6. 2011, 00:16:40
gardener:
A teď ještě ujasni kterou z těch dvou url opravdu používáš - tu co obsahuje ares_es.cgi nebo tu s darv_bas.cgi? |
||
| gardener Profil |
#5 · Zasláno: 1. 6. 2011, 00:43:02 · Upravil/a: gardener
Pravda, to jsem uplne prehlidnul. V tom druhem pripade ma byt pouzita:
Nicmene aplikace mi nevrati ani chybu ani O.K if(!empty($obchodni_jm))
{
define('ARES','http://wwwinfo.mfcr.cz/cgi-bin/ares/ares_es.cgi?xml=1&obch_jm=');
$file = @file_get_contents(ARES.$obchodni_jm);
if ($file) $xml = @simplexml_load_string($file);
$a = array();
if ($xml) {
$ns = $xml->getDocNamespaces();
$data = $xml->children($ns['are']);
$el = $data->children($ns['S'])->VBAS;
if (strval($el->ICO) == $obchodni_jm) {
$a['ico'] = strval($el->ICO);
$a['jmeno'] = strval($el->ojm);
$a['firma'] = strval($el->jmn);
$a['stav'] = 'ok';
} else
$a['stav'] = 'IC firmy nebylo nalezeno';
} else
$a['stav'] = 'Databáze ARES nenà dostupná';
echo json_encode($a);
}A v jquery volam: $(document).ready(function(){
$('#writeout').hide();
$("#verify").live("click", function(event, ui){
var ico = $('#ico').val();
//IF ICO IS NUMBER
if (ico.match(/^\d{8,}$/)) {
$.ajax({
url: "http://www.web.cz/dev/overeni-ico/ares.php",
contentType: "application/json; charset=utf-8",
dataType: "json",
data: "ico=" + ico,
cache: false,
success: function(data){
if (data.stav == 'ok') {
$('#dic').html(data.dic);
$('#firma').html(data.firma);
$('#ulice').html(data.ulice);
$('#mesto').html(data.mesto);
$('#psc').html(data.psc);
alert('Zadané IČ je platné, informace se zobrazí níže.');
$('#writeout').show();
$('ul').listview('refresh');
}
else {
alert(data.stav);
}
},
});
}
//IF ICO IS NAME OF SUBJECT
else {
alert("Jmeno");
$.ajax({
url: "http://www.web.cz/dev/overeni-ico/ares.php",
contentType: "application/json; charset=utf-8",
dataType: "json",
data: "obchodni_jm=" + ico,
cache: false,
success: function(data){
if (data.stav == 'ok') {
$('#dic').html(data.dic);
$('#firma').html(data.firma);
$('#ulice').html(data.ulice);
$('#mesto').html(data.mesto);
$('#psc').html(data.psc);
alert('Zadané IČ je platné, informace se zobrazí níže.');
$('#writeout').show();
$('ul').listview('refresh');
}
else {
alert(data.stav);
}
},
});
}
// alert(ico);
});
|
||
| YoSarin Profil |
#6 · Zasláno: 1. 6. 2011, 10:23:00
a když odstraníš ten @ před simplexml_load_string($file); tak to taky nic nevypíše?
|
||
| Medvídek Profil |
#7 · Zasláno: 1. 6. 2011, 11:47:10
gardener:
Že se nezeptáš Radka Hulána, když už si od něj zkopíroval ten kód :) |
||
| gardener Profil |
#8 · Zasláno: 1. 6. 2011, 11:53:59
Medvídek:
Protože se simple XML nemám skoro žádné zkušenosti a tady to přeci jen bude znát více lidí? YoSarin: Ten by tam měl být uvedený jestli se nepletu nebo ne? |
||
| YoSarin Profil |
#9 · Zasláno: 1. 6. 2011, 12:19:35
gardener:
ten @ znamená "mute" - jediné co dělá je to, že funkce která je bezprostředně za ním napsaná má potlačené vypisování chybových hlášek. Tzn. že tam může docházet k chybě, která se ti nikde nezobrazí. |
||
| gardener Profil |
#10 · Zasláno: 1. 6. 2011, 13:16:33
Ach so, zapamatuju si.
Nicmene i potom je prubeh stejny, je videl, ze neco se to snazi nacist, jelikoz jinak by skript vratil $a['stav'] = 'Databáze ARES nenà dostupná'; Chyba nejspise nastane zde: if (strval($el->ICO) == $obchodni_jm) {
$a['ico'] = strval($el->ICO);
$a['jmeno'] = strval($el->ojm);
$a['firma'] = strval($el->jmn);
$a['stav'] = 'ok';
} else
$a['stav'] = 'IC firmy nebylo nalezeno';Jelikoz se uz nevrati ani $a['stav'] = 'ok'; ani $a['stav'] = 'IC firmy nebylo nalezeno'; |
||
| YoSarin Profil |
#11 · Zasláno: 2. 6. 2011, 11:47:35
A co vypíše var_dump($el);?
|
||
| gardener Profil |
#12 · Zasláno: 2. 6. 2011, 12:12:20
var_dump vraci prazdnou hodnotu, kdyz jsem ale skript zmensil jen na kontrolu podle obc.h jmena>
<?php
$obchodni_jm = "Jan Novak";
if(!empty($obchodni_jm))
{
define('ARES','http://wwwinfo.mfcr.cz/cgi-bin/ares/ares_es.cgi?xml=1&obch_jm=');
$file = @file_get_contents(ARES.$obchodni_jm);
if ($file) $xml = simplexml_load_string($file);
$a = array();
if ($xml) {
$ns = $xml->getDocNamespaces();
$data = $xml->children($ns['are']);
$el = $data->children($ns['S'])->VBAS;
var_dump($el);
if (strval($el->ICO) == $obchodni_jm) {
$a['ico'] = strval($el->ICO);
$a['jmeno'] = strval($el->ojm);
$a['firma'] = strval($el->jmn);
$a['stav'] = 'ok';
} else
$a['stav'] = 'IC firmy nebylo nalezeno';
} else
$a['stav'] = 'Databáze ARES není dostupná';
echo json_encode($a);
}
?>Dostanu v php skriptu hlasku> object(SimpleXMLElement)#5 (0) { } {"stav":"IC firmy nebylo nalezeno"} Tazke si myslim, ze hledam xml elementy se spatnym nazvem, nebo minimalne uzel. Jenze kvuli odlisne strukture XML oproti vyhledavani pres ico se nemohu zorientovat v tom, co hledat jako prvni. |
||
| gardener Profil |
#13 · Zasláno: 2. 6. 2011, 15:00:32
Opravdu nikdo netusi, jak to pomoci simpleXML vyparsovat?
|
||
| YoSarin Profil |
#14 · Zasláno: 2. 6. 2011, 16:06:50 · Upravil/a: YoSarin
gardener:
VBAS tam podle mne nemá co dělat - v tomhle xml ten element vůbec není... místo něj je tam S, tak zkus: $el = $data->children($ns['S']); var_dump($el); |
||
| gardener Profil |
#15 · Zasláno: 2. 6. 2011, 16:55:20
Tak po uprave>
$ns = $xml->getDocNamespaces(); $data = $xml->children($ns['are']); $el = $data->children($ns['S']); var_dump($el); Dostanu pozmenenou chubovou hlasku> object(SimpleXMLElement)#4 (0) { } {"stav":"IC firmy nebylo nalezeno"} skoro to vypada, ze jeste odebrat 4 elementy a mohlo by to jit.. |
||
| YoSarin Profil |
#16 · Zasláno: 2. 6. 2011, 19:09:16
$ns = $xml->getDocNamespaces(); $data = $xml->children($ns['are']); $el = $data->children($ns['dtt'])->S; // pokud nepůjde ->S, tak zkusit ->V var_dump($el); |
||
| gardener Profil |
#17 · Zasláno: 2. 6. 2011, 19:28:48
Ja uz jsem take zkousel nejake kombinace ale nic..soucasny kod na vyhledavani dle jmena vypada takto:
<?php
$obchodni_jm = "Jan Novak";
if(!empty($obchodni_jm))
{
define('ARES','http://wwwinfo.mfcr.cz/cgi-bin/ares/ares_es.cgi?xml=1&obch_jm=');
$file = @file_get_contents(ARES.$obchodni_jm);
if ($file) $xml = simplexml_load_string($file);
$a = array();
if ($xml) {
$ns = $xml->getDocNamespaces();
$data = $xml->children($ns['are']);
$el = $data->children($ns['dtt'])->S; // pokud nepůjde ->S, tak zkusit ->V
var_dump($el);
if (strval($el->ICO) == $obchodni_jm) {
$a['ico'] = strval($el->ICO);
$a['jmeno'] = strval($el->ojm);
$a['firma'] = strval($el->jmn);
$a['stav'] = 'ok';
} else
$a['stav'] = 'IC firmy nebylo nalezeno';
} else
$a['stav'] = 'Databáze ARES není dostupná';
echo json_encode($a);
}
?>Nemelo by se spise pracovat s <are:Odpoved> |
||
| YoSarin Profil |
#18 · Zasláno: 3. 6. 2011, 12:13:12 · Upravil/a: YoSarin
1. máš zapnuté zobrazování chyb?
2. necháváš si zobrazovat všechny chyby? 3. odstraň ten @ před file_get_contents Když si zkusíš otevřít tu adresu v prohlížeči - jak rychle se ti načítá? Mě strašně pomalu. Když jsem si ten kód pustil u sebe, vyústilo to v Warning: file_get_contents(http://wwwinfo.mfcr.cz/cgi-bin/ares/ares_es.cgi?xml=1&obch_jm=jan%20novak) [function.file-get-contents]: failed to open stream: HTTP request failed! in C:\weby\skripts\ares.php on line 6 A funkční kód:
define('REFRESH_TIME', 3600 * 24 * 7); // doba po kterou budeš načtené údaje držet v cache
define('TMP_PATH', ''); // tady si nadefinuj cestu kam chceš ukládat nacachovaná data - apache tam musí mít právo zápisu
// tady zkusíme cache - jestli jsme stejná data z aresu v nedávné době (jeden týden) už netahali
$localFile = TMP_PATH . 'ares.preloaded.' . md5($obchodni_jm) . '.tmp';
if (!file_exists($localFile) || filemtime($localFile) <= (time() - REFRESH_TIME)) {
// pokud jsme tato konkrétní data ještě nehledali, nebo od posledního updatu uběhla příliš dlouhá doba, načteme si je z API
define('ARES','http://wwwinfo.mfcr.cz/cgi-bin/ares/ares_es.cgi?xml=1&obch_jm=');
// nastavíme si timeout pro file_get_contents na trochu vyšší hodnotu, páč API je děsně pomalé
$ctx = stream_context_create(array(
'http' => array(
'timeout' => 60
)
)
);
$file = file_get_contents(ARES . $obchodni_jm, false, $ctx);
if ($file) {
// uložíme získaná data do lokálního souboru
file_put_contents($localFile, $file);
}
} else {
// máme-li platnou cache načteme data z ní
$file = file_get_contents($localFile);
}
if ($file) {
$xml = simplexml_load_string($file);
if ($xml) {
$ns = $xml->getDocNamespaces();
$data = $xml->children($ns['are']);
$el = $data->children($ns['dtt'])->V;
foreach ($el->S as $item) {
// zpracuj si data podle potřeby
echo '<xmp>' . print_r($item, true) . '</xmp>';
}
} else {
// XML se nepodařilo načíst - nějaká chyba
}
} else {
// došlo k chybě připojení, nebo se nepodařilo soubor stáhnout či přečíst z nějakého jiného důvodu
}
echo json_encode($a);
|
||
| gardener Profil |
#19 · Zasláno: 3. 6. 2011, 13:44:16
YoSarin:
1. máš zapnuté zobrazování chyb? Mám 2. necháváš si zobrazovat všechny chyby? Na locale ano, na testovacim serveru ne 3. odstraň ten @ před file_get_contents Odstraneno Když si zkusíš otevřít tu adresu v prohlížeči - jak rychle se ti načítá? Mě strašně pomalu. Mě vcelku rychle, skoro hned. Tvuj uvedeny kod mi ale pro hodnotu "Jan Novak" vraci NULL, tobe ne? |
||
| YoSarin Profil |
#20 · Zasláno: 3. 6. 2011, 14:00:20
gardener:
Zkoušel jsem to s $obchodni_jm = 'jan%20novak'; A vypadla mi hromada výsledků... |
||
|
Časová prodleva: 3 dny
|
|||
| gardener Profil |
#21 · Zasláno: 6. 6. 2011, 12:12:55
YoSarin:
Máš pravdu, zapomněl jsem v tom vyhledávaném řetězci nahradit mezery. Díky moc za pomoc. |
||
|
Časová prodleva: 14 let
|
|||
0