我有一个simpleXml对象,想要从对象中读取数据,我是PHP新手,并不知道如何做到这一点。对象细节如下。
我需要阅读[说明]和[小时]。三江源。
SimpleXMLElement Object (
[@attributes] => Array (
[type] => array
)
[time-entry] => Array (
[0] => SimpleXMLElement Object (
[date] => 2010-01-26
[description] => TCDM1 data management: sort & upload
[hours] => 1.0
[id] => 21753865
[person-id] => 350501
[project-id] => 4287373
[todo-item-id] => SimpleXMLElement Object (
[@attributes] => Array (
[type] => integer
[nil] => true
)
)
)
[1] => SimpleXMLElement Object (
[date] => 2010-01-27
[description] => PDCH1: HTML
[hours] => 0.25
[id] => 21782012
[person-id] => 1828493
[project-id] => 4249185
[todo-item-id] => SimpleXMLElement Object (
[@attributes] => Array (
[type] => integer
[nil] => true
)
)
) ) )
请帮帮我。我尝试了很多东西,但没有正确的语法。
答案 0 :(得分:10)
如果您能给我们一个屏幕截图或给出行间距和缩进,那么上面的内容真的很难阅读,那会更好一点 如果你有一个对象
$ xml是一个simplexml对象,你可以访问像
这样的元素$xml->element.
它看起来像是时间输入的一个元素,在这种情况下你会像这样循环:
foreach( $xml->{'time-entry'} as $time_entry ) {
echo $time_entry->description . "<br />\n";
}
答案 1 :(得分:1)
如果问题print_r
中的对象位于$element
中,则以下内容将循环显示两个time-entry
元素,同时打印出各自的description
和hours
值。
foreach ($element->{'time-entry'} as $entry) {
$description = (string) $entry->description;
$hours = (string) $entry->hours;
printf("Description: %s\nHours: %s\n\n", $description, $hours);
}
输出类似:
Description: TCDM1 data management: sort & upload NFP SubProducers list
Hours: 1.0
Description: PDCH1: HTML
Hours: 0.25
请注意,time-entry
元素名称必须用大括号 1 作为字符串包装,否则$element->time-entry
会尝试读取time
元素减去一个名为entry
的常量的值,这显然不是我们想要的。此外,description
和hours
值被转换为 2 到字符串(否则它们将是SimpleXMLElement
类型的对象。)
1。请参阅variable variables 2。见type casting
答案 2 :(得分:0)
对不起我是PHP新手我刚刚开始学习,所以我的概念来自C编程。我可能在这里做过多的工作/编码......但我相信我会被某人大吼大叫并学习。
这将返回一个数组,该数组很好地用于访问所有单独的数据位而无需处理SimpleXMLElement对象:
public $xmlFileInName = 'sample.xml';
public $errorMessage = "Failed to open file: ";
public function actionGetArray()
{
try {
$xml = file_exists($this->xmlFileInName) ?
simplexml_load_file($this->xmlFileInName) :
exit($this->errorMessage. $this->xmlFileInName);
$xmlArray=$this->arrayFromSxe ($xml);
echo var_dump($xmlArray);
}
catch(Exception $e) {
echo $e->getMessage();
}
}
public function arrayFromSxe($sxe)
{
$returnArray = array();
foreach ((array)$sxe as $key=>$value) {
if(is_array($value) && !$this->is_assoc($value)) {
$indies = array();
foreach($value as $secondkey=>$secondvalue)
$indies[$secondkey] = $this->arrayFromSxe($secondvalue);
$returnArray[$key] = $indies;
}
else {
if(is_object($value)) {
$returnArray[$key] = $this->arrayFromSxe($value);
} else {
$returnArray[$key] = $value;
}
}
}
return $returnArray;
}
function is_assoc($array) {
return (bool)count(array_filter(array_keys($array), 'is_string'));
}
请注意,使用多个xml标记,例如在您的示例中:
[time-entry] => Array (
[0] => SimpleXMLElement Object (
...
)
[1] => SimpleXMLElement Object (
...
)
您必须了解XML文件的结构,以便在代码中解决此问题。 这将在调用此行后返回数组:
$xmlArray=$this->arrayFromSxe ($xml);
将有:
[time-entry][0]
[time-entry][1]
因此,您的代码需要知道通过int索引器或在多次出现xml元素的任何情况下迭代所有时间条目。
如果我所说的没有意义,那么忽略它,只需观察并评估代码。
希望这有帮助。