SimpleXML:排序XML - 将XML条目放在顶部

时间:2010-03-04 05:11:47

标签: php xml sorting

我使用SimpleXML为我的网站上的幻灯片工具添加新图像子项,代码如下:

$xml_toload = $_SERVER['DOCUMENT_ROOT']. '/xml/'.$country.'/compact.xml';
$xml = simplexml_load_file($xml_toload); //This line will load the XML file. 

$sxe = new SimpleXMLElement($xml->asXML());
//In this line it create a SimpleXMLElement object with the source of the XML file. 
//The following lines will add a new child and others child inside the previous child created. 
$image = $sxe->addChild('image');
$image->addAttribute('imageURL',$file);
$image->addAttribute('thumbURL',$file);
$image->addAttribute('linkURL',$linkurl);
$image->addAttribute('linkTarget',$linkurl);
$image->addChild('caption',$caption);

$sxe->asXML($xml_toload);

完美地添加新功能 <image attr="blabla"><caption>imageinfo</caption><image> 孩子,在<imagegallery></imagegalley>

但我有一个严重的问题,我需要这个孩子在<imagegallery>之后,而不是在标签关闭之前(一个接一个),这使得出现新图像,在最后一个位置imagegallery幻灯片。

所以我添加的最新chid应该在它添加到xml的最后一个之前去,比如

<imagegallery>
<image attr="HEREGOESTHENEWST">
    <caption>description</caption>
</image>
<image attr="THEOLDONE">
    <caption>description</caption>
</image>
</imagegallery>

任何人都可以帮我一个明确的例子吗? 谢谢,急!

2 个答案:

答案 0 :(得分:0)

我建议使用DOM api而不是simplexml。 insertBefore似乎就是你要找的东西。

答案 1 :(得分:0)

SimpleXML不支持这种操作。目前,它只能附加儿童。要在树中的任意位置插入子项,您需要专门DOMDOMNode::insertBefore()。问题是DOM很冗长并且使用起来很烦人,这就是为什么当我必须做这种事情时,我使用SimpleXML和DOM的混合。结果变成了一个名为SimpleDOM: use DOM methods with SimpleXML grammar的图书馆。

另外,这里有一些我建议作为良好做法的提示:

  • 每当您创建SimpleXMLElement对象时,请在它所代表的节点之后命名。永远不要将它命名为$xml。 “XML”是一种标记语言,它是文本。如果我看到$xml var,我认为它包含文本。
  • 这同样适用于您的$xml_toload var。它不包含XML,它包含文件路径。因此,应将其命名为$filepath
  • 您无需使用addAttribute()addChild()即可。使用数组表示法和/或对象表示法通常更简单。

结果脚本:

include 'SimpleDOM.php';

// create an <image/> element
$image = new SimpleXMLElement('<image/>');
$image['imageURL']   = $file;
$image['thumbURL']   = $file;
$image['linkURL']    = $linkurl;
$image['linkTarget'] = $linkurl;
$image->caption      = $caption;

// load the file
$path_to_file = $_SERVER['DOCUMENT_ROOT']. '/xml/'.$country.'/compact.xml';
$imagegallery = simpledom_load_file($path_to_file);

// insert the new element before the first <image/>
$imagegallery->insertBefore($image, $imagegallery->image[0]);

// save the file
$imagegallery->asXML($path_to_file);