【问题标题】:I'm trying to read a XML with namespace using PHP我正在尝试使用 PHP 读取带有命名空间的 XML
【发布时间】:2019-02-13 18:48:41
【问题描述】:

我正在尝试阅读此网址:

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
            (
            )
    )

没有过去的&lt;dc:date&gt;

我需要联系&lt;cb:value frequency="daily business" decimals="4"&gt;19.2592&lt;/cb:value&gt;

所以我可以得到 19.2592 值。

我做错了什么?

【问题讨论】:

标签: php xml


【解决方案1】:

您可以使用 XPath 来查找您之后的元素,而无需搜索每个节点...

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

XPath 在cb 命名空间(即&lt;cd:value&gt;)中查找&lt;value&gt; 元素,它还查找值为"daily business"frequency 属性。

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

【讨论】:

    【解决方案2】:

    如果可以使用 DOMXPath,还可以注册前缀和命名空间 URI ...

    DOMXPath::registerNamespace

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-30
      • 2015-12-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-28
      • 1970-01-01
      • 2019-12-17
      相关资源
      最近更新 更多