繁体   English   中英

XML中的PHP访问数组

[英]PHP access array within XML

我有一个PHP脚本,可以像这样加载XML工作表:

$feed = 'mydata.xml';
$xml = file_get_contents($feed);
$data = simplexml_load_string($xml);

echo print_r($data);

结果看起来像这样(尽管我砍了很多东西):

SimpleXMLElement Object
(
    [merchant] => SimpleXMLElement Object
        (
            [@attributes] => Array
                (
                    [id] => 1
                    [name] => companyname
                )

            [prod] => Array
                (
                    [0] => SimpleXMLElement Object
                         (
                            [@attributes] => Array
                                (
                                     [id] => 690579815
                                     [lang] => en
                                     [pre_order] => no
                                     [web_offer] => yes
                                     [in_stock] => yes
                                )

我的问题是,我该如何访问产品数组? 我希望能够这样数:

count($data['prod']);

并且还获得特定的字段值,但是我对PHP和XML还是很陌生,不能完全做到这一点。

谢谢!

要将其作为关联数组访问,请执行以下操作:

$data = json_decode(json_encode($data), true);

那么您可以像这样访问它:

count($data['merchant']['prod'])

SimpleXMLElement是一个对象,因此您还需要作为对象访问它们:

print count($data->merchant->prod);

我的问题是,我该如何访问产品数组?

你不能 因为没有数组。 但是您可以问问,这只是print_r一直在欺骗您。 SimpleXMLElement是一个对象,它可以更改在获取print_r并在此处伪造一些数组时将显示的内容。

救援的一些基础知识:

$data表示您拥有的XML的document元素。 如果您print_r XML中包含什么内容,则可以使用$data->asXML() (而不是print_r $data->asXML() (如果您通过浏览器查看源代码或将输出暗示为纯文本,否则浏览器将隐藏所有标记)。

$data['prod']为您提供该文档元素上名为prod的属性。 由于没有,它返回null

var_dump($data['prod']);   ---   NULL

NULLcount为0:

var_dump(count(NULL));     ---   int(0)

您既不想查看document元素,也不想查找属性。 您对商人元素中名为prod的子元素感兴趣。

因此,首先获取第一个商人元素:

$merchant = $data->merchant;

您将获得具有对象访问权限的元素,即具有对象操作符->元素。

然后获取名为prod的子元素数量的计数:

var_dump(count($merchant->prod));   ---   int(3)

如此所示,在$merchant表示的商人元素中,我有三(3)个名为prod的孩子。

因此,这里不需要任何数组, SimpleXMLElement允许您访问XML文档中的所有XML元素。

如前所述,数组括号用于array-access 因此它看起来像一个数组,但实际上是一个对象。 它已用于访问属性。 但这仅在键不是数字的情况下才是正确的。 如果是数字,它将访问第n个命名元素:

var_dump($merchant->prod[0]->asXML());

将给出商人元素的第一个prod元素的XML:

string(94) "<prod id="690579815" lang="en" pre_order="no" web_offer="yes" in_stock="yes">product #1</prod>"

由于它是第一个元素,因此您也可以获取其id属性:

var_dump($merchant->prod[0]['id']->asXML());

确切地返回该属性:

string(15) " id="690579815""

但这并不止于此。 XML元素和属性的每个这些SimpleXMLElement对象都可以大小写为字符串:

var_dump((string)$merchant->prod[0]);         ---   string(10) "product #1"
var_dump((string)$merchant->prod[0]['id']);   ---   string(9) "690579815"

这通常是您要查找的实际信息。 当您使用echo或类似方法时,此字符串广播将自动完成。

echo $merchant->prod[0]; // prints: "product #1"

与数组(和对象)相似,您还可以遍历每个SimpleXMLElement 例如, $merchant元素:

foreach ($merchant as $children)
{
    echo $children->asXML(), "\n";
}

给出:

<merchant id="1" name="companyname">
        <prod id="690579815" lang="en" pre_order="no" web_offer="yes" in_stock="yes">product #1</prod>
        <prod id="250544605" lang="en" pre_order="no" web_offer="yes" in_stock="yes">product #2</prod>
        <prod id="360355798" lang="en" pre_order="no" web_offer="yes" in_stock="yes">product #3</prod>
</merchant>

这是一个元素。 因此,更有趣的是使用命名的子元素:

foreach ($merchant->prod as $prod)
{
    echo $prod->asXML(), "\n";
}

现在,这给所有名为prod的孩子一个接一个:

<prod id="690579815" lang="en" pre_order="no" web_offer="yes" in_stock="yes">product #1</prod>
<prod id="250544605" lang="en" pre_order="no" web_offer="yes" in_stock="yes">product #2</prod>
<prod id="360355798" lang="en" pre_order="no" web_offer="yes" in_stock="yes">product #3</prod>

您也可以在PHP手册的Basic SimpleXML用法中找到有关说明。 咨询它作为另一个来源。

只需遵循以下规则:

  • SimpleXMLElement一起使用时, print_rvar_dump欺骗您
  • 当您已经有一个SimpleXMLElement时就不需要数组
  • 如果SimpleXMLElement的数据访问过于简单,则可以轻松使用它的姊妹DOM库,因为您可以切换到它

请参阅完整示例

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM