Поместите записи XML сверху, используя SimpleXML - PullRequest
0 голосов
/ 04 марта 2010

Я использую 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>

Однако мне нужно, чтобы этот childs шел сразу после <imagegallery>, а не перед закрытием тега (один за другим), это заставляет появляться новые изображения в последнем месте слайд-шоу imagegallery.

Таким образом, новейшие дочерние элементы, которые я добавляю, должны идти до того, как они добавились в xml в последний раз, например

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

Как мне этого добиться?

Ответы [ 2 ]

0 голосов
/ 04 марта 2010

SimpleXML не поддерживает такого рода манипуляции. В настоящее время к нему могут присоединяться только дети. Чтобы вставить дочерние элементы в произвольные места в дереве, вам нужны DOM и DOMNode :: insertBefore () . Проблема в том, что DOM многословен, и это раздражает в использовании, поэтому, когда мне приходится делать такие вещи, я использую смесь SimpleXML и DOM. Результатом стала библиотека с именем SimpleDOM: используйте методы DOM с грамматикой SimpleXML .

Кроме того, вот несколько советов, которые я рекомендую в качестве хорошей практики:

  • Всякий раз, когда вы создаете объект SimpleXMLElement, присваивайте ему имя после узла, который он представляет. Никогда не называйте это $xml. «XML» - это язык разметки, это текст. Если бы я увидел $xml var, я бы подумал, что он содержит текст.
  • То же самое относится к вашему $xml_toload вар. Он не содержит 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);
0 голосов
/ 04 марта 2010

Я бы предложил использовать DOM API вместо Simplexml. insertBefore , кажется, то, что вы ищете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...