[英]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
NULL
的count
为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用法中找到有关说明。 咨询它作为另一个来源。
只需遵循以下规则:
print_r
和var_dump
欺骗您 请参阅完整示例 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.