【问题标题】:How to find and get attribute from XML file如何从 XML 文件中查找和获取属性
【发布时间】:2013-01-31 22:27:48
【问题描述】:

如何使用 PHP 从 XML 文件中查找和获取“美元”、“英镑”和“欧元”的货币?

我的 XML 文件如下所示:

<?xml version="1.0" encoding="ISO-8859-2"?>
<tabela_kursow typ="A" uid="13a033">
   <numer_tabeli>033/A/NBP/2013</numer_tabeli>
   <data_publikacji>2013-02-15</data_publikacji>
   <pozycja>
      <nazwa_waluty>bat (Tajlandia)</nazwa_waluty>
      <przelicznik>1</przelicznik>
      <kod_waluty>THB</kod_waluty>
      <kurs_sredni>0,1052</kurs_sredni>
   </pozycja>
   <pozycja>
      <nazwa_waluty>dolar amerykański</nazwa_waluty>
      <przelicznik>1</przelicznik>
      <kod_waluty>USD</kod_waluty>
      <kurs_sredni>3,1398</kurs_sredni>
   </pozycja>

文件来自这里:Polish National Bank

我下载文件并将其保存在我的服务器上:

$basedir = "/mypath/www/dirname";

$sxe = new SimpleXMLElement("http://www.nbp.pl/kursy/xml/LastA.xml", null, true);

file_put_contents($basedir."/subdirname/output.xml", $sxe->asXML());

使用下载的 XML 文件如何仅以 &lt;kod_waluty&gt; = USD、EUR、GBP 获得 &lt;kurs_sredni&gt;

【问题讨论】:

  • 我不确定您是否可以使用 XPath 做到这一点。但是您可以将所有汇率与相应的货币放在一个数组中,然后使用您需要的。
  • 使用 $tabela_kursow = new SimpleXMLElement($basedir."/subdirname/output.xml", null, true); echo "货币:".$tabela_kursow->pozycja[1]->kurs_sredni;很容易获得 kurs_sredni 的值,但是如何找到/获取/知道它是哪个 pozycja[]?
  • user1641443 写的正是我的意思:) 你遍历所有pozycja 并检查货币和汇率。如果货币是一种您需要的货币,您可以保存汇率以备后用。

标签: php xml


【解决方案1】:

您通过迭代所有元素来做到这一点,检查当前元素是否符合您的条件,然后提取感兴趣的数据:

$sxe = new SimpleXMLElement("http://www.nbp.pl/kursy/xml/LastA.xml", null, true);

$accept = array_flip(explode(',', 'USD,EUR,GBP'));

foreach($sxe->pozycja as $pozycja)
{
    $currency = (string) $pozycja->kod_waluty;
    if (isset($accept[$currency])) {
        $accept[$currency] = (string) $pozycja->kurs_sredni;
    }
}

print_r($accept);

这给了你:

Array
(
    [USD] => 3,1398
    [EUR] => 4,1852
    [GBP] => 4,8620
)

如果您只想删除 XML 元素并再次保存 XML(正如您在问题中所建议的那样),则根本不需要过滤数据。只存储未经过滤的 XML,它不是任何类型的大文件。

【讨论】:

  • 如你所写,我会存储原始的XML文件,简单明了。
【解决方案2】:

你可以用这样的东西来阅读。这不是完整的代码,请补充:

$doc = new DOMDocument();
$doc->load( $pathFileName );

$pozycjas = $doc->getElementsByTagName( "pozycja" );

foreach($pozycjas as $eachPozycja)
{
  //readef fields
  $kod_waluty = $eachPozycja->getElementsByTagName( "kod_waluty " )->item(0)->nodeValue;

  if($kod_waluty is value u want)
       //read and store kurs_sredni
       $kurs_sredni= $eachPozycja->getElementsByTagName( "kurs_sredni" )->item(0)->nodeValue;
}

【讨论】:

  • 谢谢,我用过:$doc->loadXML(file_get_contents($pathFileName)); 但现在我收到错误:致命错误:调用未定义的方法 DOMDocument ::getElementByTagName() in... 第 65 行 第 65 行是: $pozycjas = $doc->getElementByTagName( "pozycja" );
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-18
  • 2023-01-10
  • 1970-01-01
  • 2010-11-18
  • 2011-10-19
相关资源
最近更新 更多