menggores dari antara tag pengenal tertentu dari xml

Saya memiliki yang berikut ini untuk mengekstrak nama mata uang, kode mata uang, negara dan nilai tukar, masalahnya adalah ia mengambil semua mata uang, saya hanya ingin mendapatkan mata uang tertentu yaitu hanya usd gbp dan cad

<?php

$xchange = new SimpleXMLElement('http://www.bankisrael.gov.il/currency.xml', NULL, TRUE);

echo "
<table>
        <tr>
                <th>n</th>
                <th>cc</th>
                <th>c</th>
                <th>r</th>

        </tr>";

foreach($xchange as $curr) // loop through our books
{

        echo "
        <tr>
                <td>{$curr->NAME}</td>
                <td>{$curr->CURRENCYCODE}</td>
                <td>{$curr->COUNTRY}</td>
                <td>{$curr->RATE}</td>
        </tr>";
}

echo '</table>';
?>

person Dasa    schedule 04.05.2011    source sumber


Jawaban (6)


Potongan kode ini seharusnya melakukan pekerjaan dengan cara yang lebih bersih:

<?php

$a = getCurrencyData('http://www.bankisrael.gov.il/currency.xml');
print_r($a);

function getCurrencyData($url) {

    $raw = file_get_contents($url);
    $xml = new SimpleXMLElement($raw);

    $ret = array();

    foreach($xml->CURRENCY as $currency) {
        $currency = (array) $currency;
        $ret[$currency['CURRENCYCODE']] = $currency;
    }

    return $ret;
}

Anda sekarang bisa mendapatkan mata uang yang Anda inginkan dengan menggunakan kode mata uang mis. $a['GBP']

person James C    schedule 04.05.2011

Ini tampaknya berfungsi cukup baik: memfilter segala sesuatu yang tidak ada di $filter. Jika ada di $filter, itu akan ditampilkan. Saya sudah mengujinya, dan sepertinya berfungsi dengan baik.

<?php

/**
 * This is an array indicating which currencies you want to show.
 */
$filter = array(
    'usd',
    'gbp',
    'cad'
);

$root = simplexml_load_file( 'http://www.bankisrael.gov.il/currency.xml' );

echo "
<table>
    <tr>
        <th>n</th>
        <th>cc</th>
        <th>c</th>
        <th>r</th>
    </tr>\n";

foreach( $root->CURRENCY as $currency ) {
    if( in_array( (string) strtolower( $currency->CURRENCYCODE ), $filter ) ) {
        echo "
    <tr>
        <td>{$currency->NAME}</td>
        <td>{$currency->CURRENCYCODE}</td>
        <td>{$currency->COUNTRY}</td>
        <td>{$currency->RATE}</td>
    </tr>\n";
    }
}

echo "</table>\n";
person Berry Langerak    schedule 31.05.2011

Berbicara kode

$xchange = new SimpleXMLElement('http://www.bankisrael.gov.il/currency.xml', NULL, TRUE);
$filterCurrencies = array( 'USD', 'GBP' );

$filter = implode( array_map( function($filler) { return 'text()="'.$filler.'"'; }, $filterCurrencies), ' or ' );

$xpathQuery = $xpath = '//CURRENCYCODE[%filter%]/parent::*';
$xpathQuery = str_replace('%filter%', , $xpathQuery);

$currencies = $xchange->xpath($xpathQuery);

/** I do know you already have to code to echo it ... the code is tested, feel free to copy&pase **/

Langkah demi Langkah

Oke, pertama-tama, Anda menggunakan objek SimpleXML untuk membaca data dari bank israel. Saya menyarankan untuk memanfaatkan objek ini untuk melakukan sebagian besar pekerjaan (yang jauh lebih cepat dibandingkan dengan pemfilteran dengan PHP, meskipun SimpleXML bukan yang terbaik untuk kinerja).

Jadi pertama-tama, apa yang ingin kita capai? Mendapatkan Data berdasarkan konten elemennya. Untuk seorang Webdesigner ini seharusnya terdengar seperti CSS, tapi kurang tepat. Untuk pengembang web yang sedang mencoba XML yang seharusnya terdengar seperti XPath, ini adalah pilihan emas! Untungnya, SimpleXML memungkinkan kita menggunakan XPath, jadi kita akan membuat kueri:

Dasar-dasar XPath:
//CURRENCYCODE akan memilih elemen kode mata uang apa pun
//CURRENCYCODE/parent::* akan memilih induk kode mata uang (<CURRENCY>), di mana data kita berada
//CURRENCYCODE[text()="JPY"] hanya akan memilih <CURRENCY> elemen yang teksnya sama tepatnya JPY.

Di sini kami memberi garam dengan daftar persyaratan kami:

$filterCurrencies = array( 'USD', 'GBP' ); // we want us dollars and british pounds
$filter =  implode( array_map( function($token) { return 'text()="'.$token.'"'; }, $filterCurrencies), ' or ' );
// this will make a string like 'text()="USD" or text()="GBP"' by mapping the filter against the requirements string (currenciecodes get tokens) glueing it with a logical or

Sekarang satu-satunya hal yang harus dilakukan adalah mengintegrasikannya dengan template XPATH kami

$xpath = '//CURRENCY[%filter%]/parent::*';
$xpath = str_replace('%filter%', $filter, $xpath);

$currencies = $xchange->xpath($xpath);

Selamat mengulang!

person Samuel Herzog    schedule 01.06.2011
comment
Sama seperti Anda. Ambil apa yang telah Anda posting dan ganti baris pertama ($xchange = new ...) dengan kode yang saya bawa dan itu akan berfungsi. - person Samuel Herzog; 01.06.2011

Ganti saja

foreach($xchange as $curr) // loop through our books
{
        echo "
        <tr>
                <td>{$curr->NAME}</td>
                <td>{$curr->CURRENCYCODE}</td>
                <td>{$curr->COUNTRY}</td>
                <td>{$curr->RATE}</td>
        </tr>";
}

dengan

foreach($xchange as $curr) // loop through our books
{
    if (in_array($curr->CURRENCYCODE, array('usd', 'gbp', 'cad'))) {
            echo "
            <tr>
                    <td>{$curr->NAME}</td>
                    <td>{$curr->CURRENCYCODE}</td>
                    <td>{$curr->COUNTRY}</td>
                    <td>{$curr->RATE}</td>
            </tr>";
    }
}
person Doug    schedule 03.06.2011

Saya melakukan ini sebagai berikut

function xml ($url) {
  $text = file_get_contents($url) or die("ERROR: Unable to read file");

  $p = xml_parser_create();

  xml_parser_set_option($p, XML_OPTION_CASE_FOLDING, 0);
  xml_parse_into_struct($p, $text, $vals, $index);
  xml_parser_free($p);

  for($i=0; $i<count ($index['Title']); $i++) {
    foreach(array('var1', 'var2', 'var3') as $key) {
      $info[$i][$key] = $vals[$index[$key][$i]]['value'];
    }
  }
}
person Touchpad    schedule 07.06.2011

MENGERTI

<?php

$xchange = new SimpleXMLElement('http://www.bankisrael.gov.il/currency.xml', NULL, TRUE);

echo "
<table>
        <tr>
                <th>n</th>
                <th>cc</th>
                <th>c</th>
                <th>r</th>

        </tr>

        <tr>
                <td>United States {$xchange->CURRENCY[0]->NAME} </td>
                <td>{$xchange->CURRENCY[0]->CURRENCYCODE} </td>
                <td>{$xchange->CURRENCY[0]->RATE} </td>
        </tr>
        <tr>
                <td>{$xchange->CURRENCY[1]->COUNTRY} {$xchange->CURRENCY[1]->NAME} </td>
                <td>{$xchange->CURRENCY[1]->CURRENCYCODE} </td>
                <td>{$xchange->CURRENCY[1]->RATE} </td>
        </tr>
        <tr>
                <td>{$xchange->CURRENCY[3]->NAME} </td>
                <td>{$xchange->CURRENCY[3]->CURRENCYCODE} </td>
                <td>{$xchange->CURRENCY[3]->RATE} </td>
        </tr>
        <tr>
                <td>{$xchange->CURRENCY[4]->COUNTRY}n {$xchange->CURRENCY[4]->NAME} </td>
                <td>{$xchange->CURRENCY[4]->CURRENCYCODE} </td>
                <td>{$xchange->CURRENCY[4]->RATE} </td>
        </tr>
        <tr>
                <td>Canadian {$xchange->CURRENCY[5]->NAME} </td>
                <td>{$xchange->CURRENCY[5]->CURRENCYCODE} </td>
                <td>{$xchange->CURRENCY[5]->RATE} </td>
        </tr>
        <tr>
                <td>{$xchange->CURRENCY[8]->COUNTRY}n {$xchange->CURRENCY[8]->NAME} </td>
                <td>{$xchange->CURRENCY[8]->CURRENCYCODE} </td>
                <td>{$xchange->CURRENCY[8]->RATE} </td>
        </tr>
        <tr>
                <td>Swiss {$xchange->CURRENCY[10]->NAME} </td>
                <td>{$xchange->CURRENCY[10]->CURRENCYCODE} </td>
                <td>{$xchange->CURRENCY[10]->RATE} </td>
        </tr>
</table>";


?>
person Dasa    schedule 31.05.2011
comment
ini bukan cara melakukannya, urutan dan jumlah mata uang dapat berubah - person borrel; 07.06.2011