Как правильно обработать дочерние элементы с одинаковыми названиями?

ABabiy

Новичок
Здравствуйте!
Ситуация:
Есть элемент товар, в нём дочерние элементы - имя, url, param, param, ...
У этих параметров - разные атрибуты и их значения.
Так вот - сами элементы я добавить могу, а вот атрибуты к ним - нет. Система понимает их как 1 элемент при добавлении атрибутов и говорит атрибуты уже добавлены.
По-сути получили ассоц. массив с одинаковыми ключами.
Как быть?
 

Вложения

AnrDaemon

Продвинутый новичок
Правильно писать код. Больше никак.
Компьютер - дурак по определению. Он делает только то, что вы ему сказали.
Если на выходе получается не то, что ожидали, значит - ошиблись в инструкциях.
 

ABabiy

Новичок
Правильно писать код. Больше никак.
Компьютер - дурак по определению. Он делает только то, что вы ему сказали.
Если на выходе получается не то, что ожидали, значит - ошиблись в инструкциях.
Вот написали много, а по-факту информации полезной нет.
Итак сначала:
Есть файл выгрузки. Из него надо сформировать файл, добавив данные из другого файла.
В этом другом файле УЖЕ сформированы данные описанным в первом посте способом.
Как скопировать такие записи С АТРИБУТАМИ.
Прошу не флудить
 

AnrDaemon

Продвинутый новичок
А вы сами то по факту что-то написали?…
Чтобы отвечать по факту, надо услышать вопрос по факту.
Код покажите, хотя бы…

P.S.
(а ещё там [/php] есть…)
 

ABabiy

Новичок
Код:
<offer id="56695224-89017550" productId="56695224" quantity="49">
        <categoryId>6940492</categoryId>
        <url>http://....myinsales.ru/product/silikonovaya-nakladka-iphone-5c</url>
        <price>490</price>
        <purchasePrice>0</purchasePrice>
        <picture>https://....ru/images/products/1/6479/75659599/5c-main.jpg</picture>
        <name>Силиконовая накладка iPhone 5C Yellow - Желтый</name>
        <productName>Силиконовая накладка iPhone 5C</productName>
        <param code="article" name="Артикул">a_slk_nlkd_iph5c_ylw</param>
        <param code="589710" name="Цвет">Yellow - Желтый</param>
        <unit code="pce" name="Штука" sym="шт"/>
</offer>
 
Последнее редактирование:

Вурдалак

I'd like to model your domain
Я, честно говоря, даже не понял в каком смысле у тебя не получается «добавить»: XML-схема документа не позволяет иметь более одного <param> внутри <offer> или ты пишешь какой-то PHP-код для добавления в документ и старательно его не показываешь?
 

ABabiy

Новичок
Да нет же. Делаю по следующей логике:
В цикле:
  1. Выбираю первый оффер
  2. создаю в файле результате такой-же
  3. добавляю атрибуты оффера
  4. перебираю в цикле дочерние элементы оффера
  5. добавляю в файл-результат
  6. проверяю атрибуты в оригинале для д.элемента, если есть - создаю для текущего копируемого элемента
  7. создаю следующий оффер
Ну там проверки ещё, корректировки, но сюда не относится
Так вот, когда создаю дочерний и копирую в него атрибуты - всё ок,
а когда создаётся такой же дочерний (с таким же именем) и снова пытаюсь копировать атрибуты - появляется сообщение - для этого элемента атрибуты уже существуют, хотя их создавали для предыдущего param.
 

WMix

герр M:)ller
Партнер клуба
PHP:
$xml = simplexml_load_string('<a><b c="d" /></a>');
$xml->addChild('b');
$xml->b[1]->addAttribute('c', 'e');
echo $xml->asXML();
 

ABabiy

Новичок
PHP:
$xml = simplexml_load_string('<a><b c="d" /></a>');
$xml->addChild('b');
$xml->b[1]->addAttribute('c', 'e');
echo $xml->asXML();
В моём случае так выглядит
PHP:
foreach ($item as $key_off => $off) { //перебираем элементы OFFER-a
    echo $key_off . "<br>";

    if ($key_off == 'param') {
        $offer->addChild($key_off, $off);                  
        $offer->$key_off->addAttribute('тест', 'тест1');                  
    }
}
Я так понимаю надо добавить $key_off как элемент массива
Сделал так:
PHP:
$offer->$key_off[0]->addAttribute('ddd', 'eee');
$offer->$key_off[1]->addAttribute('ddd', 'eee');
Получаю
Warning: SimpleXMLElement::addAttribute(): Unable to locate parent Element in W:\domains\integrator\index.php on line 180
Всё-равно элементы источника перебираются и там 2 похожих по имени элемента. Отличаются только значения и атрибуты, и если просто копировать их по-очереди без проблем, то добавить к второму атрибуты ну никак.
 

WMix

герр M:)ller
Партнер клуба
PHP:
foreach ($item as $key_off => $off) { //перебираем элементы OFFER-a
    echo $key_off . "<br>";

    if ($key_off == 'param') {
        $offer->addChild($key_off, $off);               
        $offer->$key_off->addAttribute('тест', 'тест1');               
    }
}
не сильно понимаю смысл данного куска кода,

почему "перебираем элементы OFFER-a" в $item
а addChild в $offer

посоветую читать документацию и задумываться на какой элемент в каждой строчке ссылаешься

PHP:
$child = $offer->addChild($key_off);
$child->addAttribute('тест', 'тест1');
 

ABabiy

Новичок
не сильно понимаю смысл данного куска кода,

почему "перебираем элементы OFFER-a" в $item
а addChild в $offer

посоветую читать документацию и задумываться на какой элемент в каждой строчке ссылаешься

PHP:
$child = $offer->addChild($key_off);
$child->addAttribute('тест', 'тест1');
Выше - цикл перебора всех offer-ов
$item - текущий offer
$key_off - дочерние элементы, их и перебираем и создаём аналогичные в файле-результате.
Был бы благодарен за краткую консультацию по скайпу, если есть возможность
s.k.y.p.e - ababiy
 

WMix

герр M:)ller
Партнер клуба
с другой стороны, у тебя есть возможность почитать, подумать и мне не напряжно
 

ABabiy

Новичок
с другой стороны, у тебя есть возможность почитать, подумать и мне не напряжно
:) Ну ок
По идее надо вставить цикл, который подсчитывает одинаковые элементы, вносит их в массив под уникальными номерами и при копировании выбирать именно крайний элемент.
Правильно ?
 

WMix

герр M:)ller
Партнер клуба
по идеи для начала необходимо описать задачу
 

ABabiy

Новичок
Задача:
есть 2 файла xml
Структура:
категории (атрибуты категорий) - подкатегории(атрибуты подкатегорий)
офферы (атрибуты офферов) - элементы офферов (атрибуты элементов офферов)
Пример офферов:

PHP:
<offer id="56695224-89017550" productId="56695224" quantity="49">
        <categoryId>6940492</categoryId>
        <url>http://,,,/product/silikonovaya-nakladka-iphone-5c</url>
        <price>490</price>
        <purchasePrice>0</purchasePrice>
        <picture>https://...images/products/1/6479/75659599/5c-main.jpg</picture>
        <name>Силиконовая накладка iPhone 5C Yellow - Желтый</name>
        <productName>Силиконовая накладка iPhone 5C</productName>
        <param code="article" name="Артикул">a_slk_nlkd_iph5c_ylw</param>
        <param code="589710" name="Цвет">Yellow - Желтый</param>
        <unit code="pce" name="Штука" sym="шт"/>
</offer>
Необходимо скопировать из slave файла в master все офферы, не существующие в master-e
Сравнивать по <param code="article" name="Артикул">a_slk_nlkd_iph5c_ylw</param>
===============
Что делаю:
Поочерёдно перебираю в цикле офферы и создаю в мастере с уникальными новый оффер, в него через addchildren перебирая в цикле добавляю дочерние элементы.
Тут всё работает как часы.
Далее решил добавить после каждого добавления дочернего элемента его атрибуты.
И вот тут получаю ошибку - параметр с такими атрибутами уже есть.
Warning: SimpleXMLElement::addAttribute(): Attribute already exists in
 
Сверху