Я стучу головой о стену здесь. Я пытаюсь выполнить цикл через XML файл, и когда выполняется определенный критерий, добавьте узел к предыдущему элементу.
Я пробовал использовать команду prev(), но мои исследования показывают, что в любом случае неправильный подход. Я пробовал команду xpath, но я не могу заставить ее работать.
Мой XML выглядит так:
<ArrayOfProductFeedEntity>
<ProductFeedEntity>
<StockNo>123</StockNo>
<MoreNodes>XXX</MoreNodes>
<MoreNodes>XXX</MoreNodes>
</ProductFeedEntity>
<ProductFeedEntity>
<StockNo>456</StockNo>
<MoreNodes>XXX</MoreNodes>
<MoreNodes>XXX</MoreNodes>
</ProductFeedEntity>
<ProductFeedEntity>
<StockNo>456-A</StockNo>
<MoreNodes>XXX</MoreNodes>
<MoreNodes>XXX</MoreNodes>
</ProductFeedEntity>
<ProductFeedEntity>
<StockNo>789</StockNo>
<MoreNodes>XXX</MoreNodes>
<MoreNodes>XXX</MoreNodes>
</ProductFeedEntity>
</ArrayOfProductFeedEntity>
Когда я достигаю 456-AI, хочу создать резервную копию всего до 456 и добавить следующие узлы. Я использую foreach для прокрутки переменной $ xml.
$p = $xml->xpath("/ArrayOfProductFeedEntity/ProductFeedEntity[StockNo=$stock]");
$size = $p->addChild("Options")->addChild("Size");
$size->addChild("Name","Size");
$size->addChild("Value", $stock);
Есть предположения?
Вам всегда понадобится цикл, SimpleXMLElement :: xpath() возвращает массив объектов SimpleXMLElement. Даже если выражение возвращает только одно или ничего.
Но то, что вы попросили, может быть сделано непосредственно в исходном выражении XPath.
Ваше выражение:
/ArrayOfProductFeedEntity/ProductFeedEntity[StockNo='456-A']
Вы выполняете это выражение на ArrayOfProductFeedEntity
элемента ArrayOfProductFeedEntity
, поэтому выражение можно упростить до:
ProductFeedEntity[StockNo='456-A']
Теперь, начиная с этого узла, вы можете получить своих предыдущих братьев и сестер:
ProductFeedEntity[StockNo='456-A']/preceding-sibling::*
и ограничить его первым (ближайшим):
ProductFeedEntity[StockNo='456-A']/preceding-sibling::*[1]
Полный пример:
$xml = new SimpleXMLElement($xml);
$expression = "ProductFeedEntity[StockNo='456-A']/preceding-sibling::*[1]";
foreach ($xml->xpath($expression) as $p) {
$size = $p->addChild("Options")->addChild("Size");
$size->addChild("Name","Size");
$size->addChild("Value", $stock);
}
echo $xml->asXml();