我正在做的是获取XML文件的<To>
标签内的文本(如下所示)并将其保存在另一个php文件的数组中。我正在使用此代码:
<?php
$email = simplexml_load_file($path);
foreach($email->thread as $thread){
foreach($thread->email as $text){
$recipients[] = $text->To;
}
}
print_r($recipients);
?>
浏览器上显示的是填充了地址的数组,但对于以下XML的数组元素,只有a,(逗号)可见,因为<
和>
代码中的地址不是被保存到数组。
XML:
<?xml version="1.0" encoding="UTF-8"?>
<root>
<thread>
<name></name>
<email>
<EmailID></EmailID>
<From></From>
<To><agenda@ietf.org> , <discuss@apps.ietf.org></To>
<Subject></Subject>
<Text>
<content> </content>
</Text>
</email>
</thread>
</root>
我在浏览器中的当前输出:
array([0] =&gt; simplexmlelement object([0] =&gt; discuss@apps.ietf.org)[1] =&gt; simplexmlelement object([0] =&gt; discuss@apps.ietf.org ,jpalme @dsv.su.se)[2] =&gt; simplexmlelement对象([0] =&gt;特里艾伦)[3] =&gt; simplexmlelement对象([0] =&gt;,)...等
答案 0 :(得分:1)
PHP将<hello@whatever.com>
视为<To>
的子节点 - 因此实际保存没有任何价值。
您有几个选项,理想的方法是编辑XML,以便将节点值包装在<![CDATA[ ... ]]>
标记中。这将确保节点中的值被视为值而不是子节点。
或者,一个更丑陋的解决方案是find the children of the <To>
node using children(),然后使用getName()方法。这将返回节点名称。它会起作用,但它很难看。
修改:或者,您可以参考this answer - 它解释了如何使用DOM
,然后强制阅读<To>
的内容作为文字。
答案 1 :(得分:1)
我发现了两个问题:
SimpleXML扩展不会创建常规对象。它创建动态生成的对象,在您阅读它们时进行扩展。因此,您无法正常使用print_r()
来可靠地检查XML内容。
同样,表示XML内容的类属性是动态生成的对象,而不是字符串。它们只查看字符串,因为它们有一个内部__toString()
方法,当您将它们转换为字符串时,它会提取文本数据。这可以在你echo
时使用,但不会在例如将它们附加到数组时(因为它不会触发转换操作)。
(毋庸置疑,如果您将XML打印到浏览器,您需要确保它不会通过发送适当的Content-Type
标头或通过检查浏览器中的原始源来呈现为HTML,通常按 Ctrl + U 。)
我建议你自己强制进行字符串转换:
foreach($email->thread as $thread){
foreach($thread->email as $text){
$recipients[] = (string)$text->To;
}
}
print_r($recipients);
答案 2 :(得分:-1)
您可以使用SimpleXML_load_string()函数将XML转换为对象。然后使用json_encode($ obj)将对象转换为JSON并解码它以获取数组(json_decode())。