2013-06-25 29 views
0

我正在尝试使用xml文件将注释列表添加到页面。我想先列出最近的评论,所以当添加新评论时,我想将它添加到xml的开头。 addChild附加到最后,所以这是不好的,我无法绕过DOMNode的insert_before方法,因为我想在每次其他事件发生之前在开始时添加它(并且我无法找到例如在任何地方这样做 - 怪异)。将XML子项添加到XML数据/文件的起始位置

xml文件看起来像;

<comments> 
    <comment> 
     <date>20130625</date> 
     <name>Jocky Wilson</name> 
     <text>Something about darts presumably</text> 
    </comment> 
    <comment> 
     <date>20130622</date> 
     <name>Jacky Wilson</name> 
     <text>It was reet petite etc</text> 
    </comment> 
</comments> 

我最初创建的文件是;

<?php 
    $xmlData = "< load of xml etc..."; 
    $xml = new SimpleXMLElement($xmlData); 
    file_put_contents("comments.xml", $xml->asXML()); 
?> 

而且工作正常。任何建议都非常感激地收到。

+0

也许这将帮助你http://stackoverflow.com/questions/3361036/php-simplexml-insert-node-at-certain-position – Robert

+0

看看这个问题,有一个很不错的解决方案;) http://stackoverflow.com/a/2093059/2519566 – Francodi

+0

谢谢,这就像一个魅力! – Ian

回答

0

作为替代在评论中提到的解决方案:
使用addChild,让它通过<date>添加节点的地方就是了,排序,并呼应它:

$xml = simplexml_load_string($x); // assume XML in $x 
$comments = $xml->xpath("//comment"); 

$field = 'date'; 
sort_obj_arr($comments, $field, SORT_DESC); 

var_dump($comments); 


// function sort_obj_array written by GZipp, see link below 
function sort_obj_arr(& $arr, $sort_field, $sort_direction) { 
    $sort_func = function($obj_1, $obj_2) use ($sort_field, $sort_direction) { 
     if ($sort_direction == SORT_ASC) { 
      return strnatcasecmp($obj_1->$sort_field, $obj_2->$sort_field); 
     } else { 
      return strnatcasecmp($obj_2->$sort_field, $obj_1->$sort_field); 
     } 
    }; 
    usort($arr, $sort_func); 
} 

看到GZipp的原始功能: Sorting an array of SimpleXML objects