我正在尝试使用PHP读取具有名称空间的XML

时间:2019-02-13 18:48:41

标签: php xml

我正在尝试阅读此URL:

http://www.anterior.banxico.org.mx/rsscb/rss?BMXC_canal=fix&BMXC_idioma=es

具有这种XML结构

<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://purl.org/rss/1.0/" xmlns:cb="http://staging.bis.org/rss-cb/1.0/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:dcterms="http://purl.org/dc/terms/" xmlns:xsi="http://www.w3c.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.w3c.org/1999/02/22-rdf-syntax-ns#rdf.xsd">
    <channel rdf:about="http://www.banxico.org.mx/rsscb/rss?canal=tipCam&idioma=es">...</channel>
    <item rdf:about="http://www.banxico.org.mx/portal-mercado-cambiario/index.html/20190212">
        <title>
            <![CDATA[ MX: 19.2592 MXN = 1 USD 2019-02-12 BM FIX ]]>
        </title>
        <link>
            http://www.banxico.org.mx/portal-mercado-cambiario/index.html#FIX
        </link>
        <description>
            <![CDATA[
            Este tipo de cambio es determinado por el Banco de México los días hábiles bancarios con base en un promedio de las cotizaciones del mercado de cambios al mayoreo para operaciones liquidables el segundo día hábil bancario siguiente.
            ]]>
        </description>
        <dc:date>2019-02-12T12:01:34-06:00</dc:date>
        <dc:language>es</dc:language>
        <dc:format>text/html</dc:format>
        <dc:creator>Banco de México</dc:creator>
        <cb:simpletitle>FIX</cb:simpletitle>
            <cb:statistics>
            <cb:country>MX</cb:country>
            <cb:institutionAbbrev>BM</cb:institutionAbbrev>
                <cb:exchangeRate>
                    <cb:value frequency="daily business" decimals="4">19.2592</cb:value>
                    <cb:baseCurrency>USD</cb:baseCurrency>
                    <cb:targetCurrency>MXN</cb:targetCurrency>
                    <cb:rateName>FIX</cb:rateName>
                </cb:exchangeRate>
            </cb:statistics>
    </item>
</rdf:RDF>

我正在使用以下代码:

$url = "http://www.anterior.banxico.org.mx/rsscb/rss?BMXC_canal=fix&BMXC_idioma=es";
$xml = simplexml_load_file($url);
$item = $xml->item;

print_r($item);

我得到这个结果:

SimpleXMLElement Object
    (
        [title] => SimpleXMLElement Object
            (
            )
        [link] => http://www.banxico.org.mx/portal-mercado-cambiario/index.html#FIX
        [description] => SimpleXMLElement Object
            (
            )
    )

没有过去的<dc:date>

我需要去<cb:value frequency="daily business" decimals="4">19.2592</cb:value>

所以我可以获得 19.2592 值。

我做错了什么?

2 个答案:

答案 0 :(得分:1)

您可以使用XPath查找后面的元素,而不必搜索每个节点...

$values =  $item->xpath("//cb:value[@frequency=\"daily business\"]");
echo (string)$values[0];

XPath在<value>名称空间中搜索cb元素(因此<cd:value>),它也在frequency属性中寻找值"daily business"

xpath()调用将返回匹配节点的列表,因此请使用[0]来获取第一个元素,并使用(string)使其强制为字符串(或者您可以使用{ {1}}(如果您想将其用于计算)。

答案 1 :(得分:0)

如果可以使用DOMXPath ...,也可以注册前缀和名称空间URI。

DOMXPath::registerNamespace

相关问题