Обновление значения узла XML с помощью SimpleXML API

0

У меня есть структура XML:

<root>
   <!-- ... -->
   <B ID="444">
        <C></C>  
        <D>Anything</D>
        <E>
            <child1 /*expected outcome came in here*/> /*sometimes here*/ </child1>
            <child2>data2 <!-- instead of here --></child2>
            <child3>data3</child3>
            <child4>data4 /* and also here instead*/ </child4>
        </E>
    </B>
   <!-- ... -->
</root>

Я сделал запрос XPath для извлечения //*B, где child2==data2 и child4==data4, например:

$query = "//*[@ID=444]//*['data2' and 'data4']";
$result = $xml->xpath($query);

он работал нормально. Но теперь я хочу обновить data1 и data3 после поиска соответствия, используя только simplexml API. Вот что я сделал, но он не работает правильно:

if(!empty($result)){
    $result[0]['data2'] = "Blabla";
    $result[0]['data4'] = "Blaaaaaaaa";
    return $xml->saveXML($File;
}

Что я делаю не так? Или как это сделать лучше с помощью simplexml? Любая идея будет оценена по достоинству.

Теги:
xpath
simplexml

1 ответ

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

Я сделал запрос XPath для извлечения //*B, где child2==data2 и child4==data4, например:

$query = "//*[@ID=444]//*['data2' and 'data4']";

Это уже неправильно. Как вы думаете, ваша попытка сравнить child2 с 'data2' или child4 с 'data4'?

Лучше:

$query = "//B[@ID = 444 and .//child2 = 'data2' and .//child4 = 'data4']";
$result = $xml->xpath($query);

foreach ($result as $b) {
    // find first <child2> and <child4> descendants
    $child2 = $b->xpath(".//child2")[0];
    $child4 = $b->xpath(".//child4")[0];

    // set their text values
    $child2[0] = "Blabla";
    $child4[0] = "Blaaaaaaaa";
}

return $xml->saveXML($File);

См. Http://ideone.com/lXtvbP

  • 0
    Спасибо @Tomalak, но как насчет того, чтобы не знать заранее, что такое data2 и data4, а просто захотеть изменить или обновить все, что есть в child2 и child4? какое выражение это делает?
  • 0
    Если вы думаете об этом в течение нескольких минут, это придет к вам. - Мой ответ соответствует вашему вопросу, вы явно говорили о «запросе XPath для извлечения //*B , где child2==data2 и child4==data4 » . Если вы хотите что-то еще, вы должны были задать вопрос по-другому.
Показать ещё 2 комментария

Ещё вопросы

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