我有以下代码可行,但似乎是不正确的实现方法。忽视“....”,这是我们不必担心的所有额外的东西。我遇到的问题是Sup
在某些时候是一个数组,有时它只是一个值(左右print_r
声称,我想/希望它只是一个元素数组)。
$users
是一个简单的XML元素。
foreach($users as $user) {
if ($user->InstSup->Sup[1] == '') {
foreach($user->InstSup as $affid) {
....
} else {
foreach($user->InstSup->Sup as $affid) {
以下是不同的实例......
<Users>
<User>
<InstSup><Sup>1</Sup></InstSup>
</User>
<User>
<InstSup><Sup>2</Sup><Sup>3</Sup><Sup>4</Sup><Sup>5</Sup></InstSup>
</User>
</Users>
感谢。
答案 0 :(得分:1)
首先,当您处理 SimpleXMLElement 时,不要相信print_r
(或var_dump
)的输出。它没有显示整体情况,最好按原样查看XML,例如使用asXML()
method。
现在解决你遇到的问题。如果您想拥有<Sup>
个<InstSup>
元素的列表(对于&#34;数组&#34;),您最好使用 Xpath查询文档。它非常直接,可以为您提供所需的数组:
$users = new SimpleXMLElement($buffer);
$sups = $users->xpath('/Users/User/InstSup/Sup');
foreach ($sups as $index => $sup) {
printf("#%d: %s (%s)\n", $index, $sup, $sup->asXML());
}
这会创建以下输出:
#0: 1 (<Sup>1</Sup>)
#1: 2 (<Sup>2</Sup>)
#2: 3 (<Sup>3</Sup>)
#3: 4 (<Sup>4</Sup>)
#4: 5 (<Sup>5</Sup>)
这是完成示例的$buffer
:
$buffer = <<<XML
<Users>
<User>
<InstSup><Sup>1</Sup></InstSup>
</User>
<User>
<InstSup><Sup>2</Sup><Sup>3</Sup><Sup>4</Sup><Sup>5</Sup></InstSup>
</User>
</Users>
XML;
正如输出中的阵容显示的那样,即使<Sup>
元素位于(同名但是)不同的父元素内, XPath查询表达式
/Users/User/InstSup/Sup
从文档中返回该路径中的所有元素。
所以希望你现在更好地理解,不仅print_r
不是那么有用,因为它不能展示整个画面,而且还能通过理解文档是如何显示它的。 ; s节点有序,您甚至可以使用Xpath表达式更轻松地查询数据。