了解 PHP 中 SimpleXMLElement 对象的形成
Understanding the formation of SimpleXMLElement object in PHP
我很想知道一个 SimpleXMLElement 对象是如何从 XML 文档在 PHP 中形成的,但我认为这个过程中可能有一些未知的东西对我来说。
当我们遍历 PHP 中的一个对象时,public 属性被迭代。因此,如果第一个 属性 是一个数组,那么我们应该在第一个循环中需要另一个循环来迭代它,但是,SimpleXMLElement 对象似乎并非如此。例如看这个对象:
object(SimpleXMLElement)#1 (1) {
["user"]=>
array(5) {
[0]=>
object(SimpleXMLElement)#2 (3) {
["firstname"]=>
string(6) "Sheila"
["surname"]=>
string(5) "Green"
["contact"]=>
object(SimpleXMLElement)#7 (3) {
["phone"]=>
string(9) "1234 1234"
["url"]=>
string(18) "http://example.com"
["email"]=>
string(18) "pamela@example.com"
}
}
[1]=>
object(SimpleXMLElement)#3 (3) {
["firstname"]=>
string(5) "Bruce"
["surname"]=>
string(5) "Smith"
.
.
.
它包含一个 "user" 属性,其中有一个数组(包含 5 个元素)。所以当我们遍历这个对象时,我们应该得到这个错误:
Notice: Array to string conversion in ...
我已经在这段代码中对此进行了测试:
$var = (object)array(
'user'=>['joe','mia'],
);
现在这个循环给出了我刚才提到的错误:
foreach ($test as $property => $val){
echo $property.':'.$val.'<br>';
}
循环中的$val
是数组,不能回显。使用print_r($val)
来显示它的价值。
foreach ($test as $property => $val){
echo $property.':';
print_r($val);
echo '<br>';
}
了解基本的 SimpleXML 处理是如何工作的是值得的,试图绕过对象的内部结构是无济于事的。尝试访问元素时,使用 ->elementName
您可能拥有的数据的简单模型...
$data = "<base>
<user>
<firstname>Sheila</firstname>
<surname>Green</surname>
<contact>
<phone>1234 1234</phone>
</contact>
</user>
</base>";
如果您想打印出 <user>
下的所有元素,那么您可以使用 foreach()
并使用 ->user->children()
,如...
$xml = simplexml_load_string($data);
//print_r($xml);
foreach ( $xml->user->children() as $tag => $value ) {
echo $tag."-".$value.PHP_EOL;
}
哪个输出...
firstname-Sheila
surname-Green
contact-
由于联系人本身就是一个结构,您可以添加
if ( $value->count() > 0 ) {
foreach ( $value->children() as $tag => $sub ) {
echo $tag."-".$sub.PHP_EOL;
}
}
允许您打印出来。
我很想知道一个 SimpleXMLElement 对象是如何从 XML 文档在 PHP 中形成的,但我认为这个过程中可能有一些未知的东西对我来说。
当我们遍历 PHP 中的一个对象时,public 属性被迭代。因此,如果第一个 属性 是一个数组,那么我们应该在第一个循环中需要另一个循环来迭代它,但是,SimpleXMLElement 对象似乎并非如此。例如看这个对象:
object(SimpleXMLElement)#1 (1) {
["user"]=>
array(5) {
[0]=>
object(SimpleXMLElement)#2 (3) {
["firstname"]=>
string(6) "Sheila"
["surname"]=>
string(5) "Green"
["contact"]=>
object(SimpleXMLElement)#7 (3) {
["phone"]=>
string(9) "1234 1234"
["url"]=>
string(18) "http://example.com"
["email"]=>
string(18) "pamela@example.com"
}
}
[1]=>
object(SimpleXMLElement)#3 (3) {
["firstname"]=>
string(5) "Bruce"
["surname"]=>
string(5) "Smith"
.
.
.
它包含一个 "user" 属性,其中有一个数组(包含 5 个元素)。所以当我们遍历这个对象时,我们应该得到这个错误:
Notice: Array to string conversion in ...
我已经在这段代码中对此进行了测试:
$var = (object)array(
'user'=>['joe','mia'],
);
现在这个循环给出了我刚才提到的错误:
foreach ($test as $property => $val){
echo $property.':'.$val.'<br>';
}
$val
是数组,不能回显。使用print_r($val)
来显示它的价值。
foreach ($test as $property => $val){
echo $property.':';
print_r($val);
echo '<br>';
}
了解基本的 SimpleXML 处理是如何工作的是值得的,试图绕过对象的内部结构是无济于事的。尝试访问元素时,使用 ->elementName
您可能拥有的数据的简单模型...
$data = "<base>
<user>
<firstname>Sheila</firstname>
<surname>Green</surname>
<contact>
<phone>1234 1234</phone>
</contact>
</user>
</base>";
如果您想打印出 <user>
下的所有元素,那么您可以使用 foreach()
并使用 ->user->children()
,如...
$xml = simplexml_load_string($data);
//print_r($xml);
foreach ( $xml->user->children() as $tag => $value ) {
echo $tag."-".$value.PHP_EOL;
}
哪个输出...
firstname-Sheila
surname-Green
contact-
由于联系人本身就是一个结构,您可以添加
if ( $value->count() > 0 ) {
foreach ( $value->children() as $tag => $sub ) {
echo $tag."-".$sub.PHP_EOL;
}
}
允许您打印出来。