PHP: xpath или prev () или для цикла?

0

Я стучу головой о стену здесь. Я пытаюсь выполнить цикл через 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);

Есть предположения?

Теги:
xpath

1 ответ

1
Лучший ответ

Вам всегда понадобится цикл, 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();

Ещё вопросы

Сообщество Overcoder
Наверх
Меню