Как добавить вложенный элемент xml

Я сейчас нахожусь в процессе создания фида списков свойств XML, который синдикатор будет использовать для публикации наших списков.

Я использую Cakephp, но не использую инструменты Cakephp xml. Просто не смог отформатировать вывод, как мне это нужно.

У меня очень простой запрос. (многие поля не включены здесь для ясности)

$sql = "select
Listing.id as PropertyId,
Listing.address as StreetAddress,
Listing.title as Caption,
Listing.description as Description
from properties as Listing
limit 2";

$properties = $this->Property->query($sql);

Затем немного очистить и добавить некоторые атрибуты, которых нет в БД.

for($i=0;$i<count($properties);$i++){
$properties[$i]['Listing']['StreetAddress'] = '<![CDATA['.$properties[$i]['Listing']['StreetAddress'].']]>';
$properties[$i]['Listing']['DescriptionLang'] = "x";
$properties[$i]['Listing']['Caption'] = '<![CDATA['.$properties[$i]['Listing']['Caption'].']]>';
$properties[$i]['Listing']['Description'] = '<![CDATA['.$properties[$i]['Listing']['Description'].']]>';
}

Я использую эту функцию для обработки массива …

header("Content-type: text/xml; charset=utf-8");
$domtree = new DOMDocument('1.0', 'UTF-8');
$xmlRoot = $domtree->createElement("Listings");
$xmlRoot = $domtree->appendChild($xmlRoot);
foreach($properties as $p){
foreach ($p as $key=>$value){
$currentElement= $domtree->createElement($key);
$currentElement= $xmlRoot->appendChild($currentElement);
if(is_array($value))
{
foreach ($value as $k=>$v)
{
$currentElement->appendChild($domtree->createElement($k,$v));
}
}
}
}
echo $domtree->saveXML();
exit;

Создает это, что почти идеально:

 <Listings>
<Listing>
<PropertyId>2</PropertyId>
<StreetAddress><![CDATA[243 E 7th Ave]]></StreetAddress>
<Caption><![CDATA[Wholesale Deal]]></Caption>
<Description><![CDATA[]]></Description>
<DescriptionLang>x</DescriptionLang>
</Listing>
<Listing>
<PropertyId>3</PropertyId>
<StreetAddress><![CDATA[3724 W Glenn Dr]]></StreetAddress>
<Caption><![CDATA[Wholesale Deal]]></Caption>
<Description><![CDATA[]]></Description>
<DescriptionLang>x</DescriptionLang>
</Listing>
</Listings>

Вывод выглядит великолепно … за исключением того, что мне нужно сделать две вещи.

1.) Тег для DescriptionLang должен быть следующим, но вызывает проблемы …

<DescriptionLang value="en">

Это не любит пространство или кавычки. Для цитат я пробовал это …

&quot;

Но и в церкви это происходит, как пердеть.

Обновление: спецификация xml не допускает пробелов. Поэтому я проверяю синдикатора, чтобы узнать, сможет ли он сказать мне, как им сходит с рук что-то, что невозможно сделать.

2.) Но главное в том, что элементы Caption и Description должны быть вложены в элемент DescriptionLang, вот так …

<DescriptionLang value="en">
<Caption><![CDATA[ captionhere ]]></Caption>
<Description><![CDATA[ descriptionhere ]]></Description>
</DescriptionLang>

Я пробовал больше сумасшедших вещей, которые я могу включить сюда. Похоже, я должен иметь возможность просто добавить еще один уровень на этапе чистки, но нет.

Конечно, можно использовать небольшое руководство здесь.

0

Решение

Я закончил этот проект, так что думал, что поделюсь финальным конструктором XML-массивов. В спецификации данных было всего несколько элементов, для которых требовался набор атрибутов или вложенных элементов. Я понятия не имею, есть ли более простой способ сделать это, так как это была моя первая попытка что-нибудь xml. Работает идеально подходит для моих нужд.

header("Content-type: text/xml; charset=utf-8");
$domtree = new DOMDocument('1.0', 'UTF-8');
$xmlRoot = $domtree->createElement("Listings");
$xmlRoot = $domtree->appendChild($xmlRoot);
foreach($properties as $p){
foreach ($p as $key=>$value){
$currentElement= $domtree->createElement($key);
$currentElement= $xmlRoot->appendChild($currentElement);
if(is_array($value))
{
foreach ($value as $k=>$v)
{
if(!in_array($k,array('Caption','Description','DetailsURL','PhotoURL')))
$level = $currentElement->appendChild($domtree->createElement($k,$v));

if($k == "DescriptionLang"){//create nested elements
$level->setAttribute('value', 'en');
foreach($value as $k1=>$v1){
if(in_array($k1,array('Caption','Description','DetailsURL'))){
$level->appendChild($domtree->createElement($k1,$v1));
}
}
}

if($k == 'PhotoURL'){//create photo elements
$images = $this->grab_pics($v);
if(!empty($images))
foreach($images as $i){
$url =  FULL_BASE_URL.'/property_images/'.$v.'/'.$i.'.jpg';
$currentElement->appendChild($domtree->createElement($k,$url));
}
}
}
}
}
}
echo $domtree->saveXML();
exit;
0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector