【问题标题】:scraping from in between specific identifiable tags from xml从 xml 的特定可识别标签之间抓取
【发布时间】:2011-08-18 15:14:38
【问题描述】:

我有以下提取货币名称货币代码国家和汇率的方法,问题是它抓取了所有货币,我只想获取某些货币,即只有美元 gbp 和 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>';
?>

【问题讨论】:

    标签: php xml simplexml


    【解决方案1】:

    这段代码应该以更简洁的方式完成这项工作:

    <?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;
    }
    

    您现在可以使用货币代码获取所需的货币,例如$a['GBP']

    【讨论】:

      【解决方案2】:

      这似乎工作得很好:它过滤掉了所有不在 $filter 中的东西。如果它在 $filter 中,它将被显示。我已经对其进行了测试,它似乎很有效。

      <?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";
      

      【讨论】:

        【解决方案3】:

        讲代码

        $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 **/
        

        一步一步

        好的,首先,您使用 SimpleXML 对象从以色列银行读取数据。我建议利用这个对象来完成大部分工作(这比使用 PHP 过滤要快得多,尽管 SimpleXML 并不是最好的性能)。

        那么首先我们想要完成什么? 根据元素的内容获取 a 的数据。 对于网页设计师来说,这听起来应该像 CSS,但并不完全正确。对于拥有听起来像 XPath 的 XML 的 Web 开发人员来说,这是最佳选择! 幸运的是,SimpleXML 使我们能够使用 XPath,因此我们将构建一个查询:

        XPath 基础知识
        //CURRENCYCODE 将选择任何货币代码元素
        //CURRENCYCODE/parent::* 将选择货币代码父级 (&lt;CURRENCY&gt;),这是我们的数据所在的位置
        //CURRENCYCODE[text()="JPY"] 将只选择文本正好等于 JPY 的 &lt;CURRENCY&gt; 元素。

        在这里,我们用我们的需求列表来加盐:

        $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
        

        现在唯一要做的就是将它与我​​们的 XPATH 模板集成

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

        循环愉快!

        【讨论】:

        • 和你一样。取您发布的内容并将第一行 ($xchange = new ...) 替换为我引入的代码,它将起作用。
        【解决方案4】:

        简单替换

        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>";
        }
        

        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>";
            }
        }
        

        【讨论】:

          【解决方案5】:

          我这样做如下

          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'];
              }
            }
          }
          

          【讨论】:

            【解决方案6】:

            知道了

            <?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>";
            
            
            ?>
            

            【讨论】:

            • 这不是办法,顺序和货币数量可以改变
            猜你喜欢
            • 1970-01-01
            • 2018-01-27
            • 1970-01-01
            • 2021-12-21
            • 2012-02-19
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多