Узел клонирования XML domDocument PHP 7.1 с подузлами

Я должен решить эту проблему с помощью PHP и DomDocument (также может подойти simplexml). Я много гуглил, но не нашел подходящего примера, чтобы узнать, как это сделать:

У меня есть следующий XML-код eBay

<?xml version = "1.0" encoding = "utf-8"?>
<ReviseInventoryStatusRequest xmlns = "urn:ebay:apis:eBLBaseComponents">
  <RequesterCredentials>
    <eBayAuthToken>INSERT_TOKEN</eBayAuthToken>
  </RequesterCredentials>
  <InventoryStatus>
    <ItemID> ItemIDType (string) </ItemID>
    <Quantity> int </Quantity>
    <SKU> SKUType (string) </SKU>
    <StartPrice> AmountType (double) </StartPrice>
  </InventoryStatus>
  <ErrorLanguage>en-US</ErrorLanguage>
  <Version> string </Version>
  <WarningLevel>Low</WarningLevel>
</ReviseInventoryStatusRequest>

и мне нужно клонировать (фактически 4 раза) узел <InventoryStatus> со всеми его подузлами:

  <InventoryStatus>
    <ItemID> ItemIDType (string) </ItemID>
    <Quantity> int </Quantity>
    <SKU> SKUType (string) </SKU>
    <StartPrice> AmountType (double) </StartPrice>
  </InventoryStatus>

и добавить прямо под текущим узлом

Пожалуйста, дайте несколько советов

Спасибо!

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
0
162
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

DOMDocument намного лучше справляется с подобными вещами и может просто клонировать узлы с помощью cloneNode(), а передача true выполняет глубокое клонирование, которое также копирует контент. Затем вы можете добавить узел обратно туда, где он вам нужен ...

$dom = new DOMDocument();
$dom->load("data.xml");

$is = $dom->getElementsByTagName("InventoryStatus");
$dom->documentElement->appendChild($is[0]->cloneNode(true));
$dom->documentElement->appendChild($is[0]->cloneNode(true));
$dom->documentElement->appendChild($is[0]->cloneNode(true));
$dom->documentElement->appendChild($is[0]->cloneNode(true));
echo $dom->saveXML();

Вау! Так просто :-( Хорошо, я также смог изменить значения для всех дочерних узлов всех клонированных узлов, а также удалить узел из dom и использовать insertbefore, НО не удалось удалить узел из $ is .. могу я задаю вам также этот вопрос Спасибо

Joe 20.12.2018 20:30

Когда вы говорите удалить узел, можете ли вы привести пример того, что вы хотите удалить.

Nigel Ren 20.12.2018 20:32

Количество: Я сделал это, но не работает: `$ Q = $ is-> getElementsByTagName (" Quantity "); $ Q-> parentNode-> removeChild ($ Q); `

Joe 20.12.2018 20:43
$is - это DOMNodeList, если вы хотите его использовать, то, как и при вызове cloneNode(), вам нужно использовать $is[0]
Nigel Ren 20.12.2018 20:47

Понятно ... Я провел много тестов и уверен, что поставил [0] во многих местах ... и я уверен, что также в этой точке ... но поскольку я проверил еще раз ... в этом случае ошибка в последнем инструкция: $Q->parentNode->removeChild($Q);

Joe 20.12.2018 20:59

Хорошо .. Я проведу еще несколько тестов. Большое спасибо: теперь, по крайней мере, знайте, что эта инструкция верна! Поскольку я не хочу удалять из $ dom, но из клонированного $, это потому, что у одного узла будет количество, а у другого - нет. поскольку я удалил другой узел, но на этот раз из $ dom: с помощью следующих инструкций: $ SKU = $ xml-> getElementsByTagName ("SKU") -> item (0); $ SKU-> parentNode-> removeChild ($ SKU);

Joe 20.12.2018 21:00

Другие вопросы по теме