如何使用phpstorm评估特定名称空间的xpath? - php

欧洲中央银行提供来自欧元的XML document for currency exchange rates依赖项。

<?xml version="1.0" encoding="UTF-8"?>
<gesmes:Envelope xmlns:gesmes="http://www.gesmes.org/xml/2002-08-01" xmlns="http://www.ecb.int/vocabulary/2002-08-01/eurofxref">
    <gesmes:subject>Reference rates</gesmes:subject>
    <gesmes:Sender>
        <gesmes:name>European Central Bank</gesmes:name>
    </gesmes:Sender>
    <Cube>
        <Cube time='2015-09-17'>
            <Cube currency='USD' rate='1.1312'/>
            <Cube currency='JPY' rate='136.76'/>
            <Cube currency='BGN' rate='1.9558'/>
            ...
        </Cube>
    </Cube>
</gesmes:Envelope>

我已将这个XML文件存储为货币汇率提供商的测试用例,因为我想为其编写解析器。

我想使用phpstorm的Evaluate XPath...功能。

但是它似乎并没有认识到名称空间。因此找不到与//Cube匹配的内容。

我也尝试使用Show unique XPath,对我来说,它显示

/gesmes:Envelope/e:Cube/e:Cube/e:Cube/@rate

然而,用它来评估收益却没有任何回应。

我想我的配置错误(当我尝试编辑上下文时,我不知道自己在做什么)。

如何设置正确的名称空间?

参考方案

您在Xpath表达式中为名称空间e使用了前缀http://www.ecb.int/vocabulary/2002-08-01/eurofxref,但为其配置了前缀c

您无需使用PHP为其编写解析器。只需使用DOM + Xpath。

$document = new DOMDocument();
$document->loadXml($xml);
$xpath = new DOMXpath($document);
$xpath->registerNamespace('gesmes', 'http://www.gesmes.org/xml/2002-08-01');
$xpath->registerNamespace('e', 'http://www.ecb.int/vocabulary/2002-08-01/eurofxref');

$time = $xpath->evaluate('string(/gesmes:Envelope/e:Cube/e:Cube/@time)');

$rates = [];
foreach ($xpath->evaluate('/gesmes:Envelope/e:Cube/e:Cube/e:Cube') as $cube) {
  $rates[$cube->getAttribute('currency')] = $cube->getAttribute('rate');
}

var_dump($time, $rates);

输出:

string(10) "2015-09-22"
array(31) {
  ["USD"]=>
  string(6) "1.1155"
  ["JPY"]=>
  string(6) "133.75"
  ["BGN"]=>
  string(6) "1.9558"
  ["CZK"]=>
  string(6) "27.057"
  ["DKK"]=> ...

PHP:将数组值加在一起 - php

我相信这比标题听起来要难一些,但我可能完全错了。我有一个像这样的数组:[["londrina",15],["cascavel",34],["londrina",23],['tiradentes',34],['tiradentes',21]] 我希望能够采用通用…

PHP JQuery复选框 - php

我有以下片段。 var myData = { video: $("input[name='video[]']:checked").serialize(), sinopse: $("#sinopse").val(), dia: $("#dia").val(), quem: $(&#…

PHP:对数组排序 - php

请如何排序以下数组Array ( 'ben' => 1.0, 'ken' => 2.0, 'sam' => 1.5 ) 至Array ( 'ken' => 2.0, 'sam' => 1.5, 'ben' =&…

转义字符无法正常工作 - php

我试图在PHP中创建html内容,并且为onclick事件提供了一个名为uchat的div函数。该函数采用一个字符串的名称参数。如下所示:$name = "Php string"; $echostr .= "<div onClick='uchat(\'$name\')'> &l…

PHP-复选框组 - php

我有一个需要发布的表单复选框组。<input type="checkbox" value="true" checked name="chk0[]"> <input type="checkbox" value="false" name=…