我有一个加载XML表的PHP脚本,如下所示:
$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
)
我的问题是,如何访问 prod 数组? 我希望能够像这样计算:
count($data['prod']);
并且还获得了特定的字段值,但我对PHP和XML很新,并且不能完全实现它。
谢谢!
答案 0 :(得分:0)
要以关联数组的形式访问它,请执行以下操作:
$data = json_decode(json_encode($data), true);
然后您可以像这样访问它:
count($data['merchant']['prod'])
答案 1 :(得分:0)
SimpleXMLElement
是一个对象,因此您还需要将它们作为对象访问:
print count($data->merchant->prod);
答案 2 :(得分:0)
我的问题是,如何访问prod阵列?
你不能。因为没有数组。但是你可以问,只是print_r
只是在愚弄你一点。 SimpleXMLElement 是一个对象,它可以更改print_r
&#39}时显示的内容,并伪造一些数组。
救援的一些基础知识:
$data
表示您拥有的XML的文档元素。如果您不确定XML中的内容,而不是print_r
查看$data->asXML()
(如果您浏览浏览器视图源或将输出提示为纯文本,否则浏览器将隐藏所有标签。)
$data['prod']
为您提供该文档元素上名为 prod 的属性。由于没有,它返回null
:
var_dump($data['prod']); --- NULL
count
的{{1}}为0:
NULL
您既不想查看文档元素,也不想查找属性。您对商家元素中名为 prod 的子元素感兴趣。
首先获取第一个商家元素:
var_dump(count(NULL)); --- int(0)
获取具有对象访问权限的元素,即使用对象运算符$merchant = $data->merchant;
。
获取名为 prod 的子元素数量的计数:
->
如图所示,我在var_dump(count($merchant->prod)); --- int(3)
所代表的商家元素中有三(3)个名为 prod 的孩子。
因此,您不需要任何数组, SimpleXMLElement 允许您访问XML文档中的所有XML元素。
如前所述,数组括号用于array-access。所以它看起来像一个数组,但它实际上是一个对象。它已被用于访问属性。但这只是真的,如果密钥不是数字。如果它是一个数字,它将访问第n个命名元素:
$merchant
将提供商家元素的第一个 prod 元素的XML:
var_dump($merchant->prod[0]->asXML());
由于它是第一个元素,您也可以获取它的 id 属性:
string(94) "<prod id="690579815" lang="en" pre_order="no" web_offer="yes" in_stock="yes">product #1</prod>"
确切地返回该属性:
var_dump($merchant->prod[0]['id']->asXML());
但它并不止于此。 XML元素和属性的每个 SimpleXMLElement 对象都可以加入字符串:
string(15) " id="690579815""
这通常是您正在寻找的实际信息。当您使用var_dump((string)$merchant->prod[0]); --- string(10) "product #1"
var_dump((string)$merchant->prod[0]['id']); --- string(9) "690579815"
或类似内容时,此字符串转换将自动完成。
echo
与数组(和对象)类似,您也可以遍历每个 SimpleXMLElement 。例如echo $merchant->prod[0]; // prints: "product #1"
元素:
$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>
现在一个接一个地给所有名为 prod 的孩子:
foreach ($merchant->prod as $prod)
{
echo $prod->asXML(), "\n";
}
您可以在PHP手册的Basic SimpleXML usage中找到这一点。请将其作为另一个来源咨询。
请遵守以下规则:
<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>
和print_r
作弊