Рекурсивное изменение значений узлов XML с помощью PHP

1

Я пытаюсь изменить "текстовое" значение узлов xml, таких как:

<set>
  <a><b:x>VALUE1</b:x></a>
  <c:y>VALUE2</c:y>
  <d><e><f/><g:z>VALUE3</g:z></e></d>
  <h>VALUE4</h>
</set>

XML файл узла, который я пытаюсь разрешить, очень неупорядочен,

$src = file_get_contents('file.xml') ;
$xml = new SimpleXMLElement($src);
array_walk($xml->xpath('//*'), function(&$node) {
    echo $node."\n" ; // how to reach inline text value?
});
echo $xml->asXML();

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

  • 0
  • 0
    Поменять "текстовые" значения на какие? Пожалуйста, оставьте желаемые результаты.
Теги:

1 ответ

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

SimpleXML имеет только объекты SimpleXMLElement - представляющие узлы элементов. Вы можете получить другие типы узлов с помощью Xpath, но SimpleXML не может полностью их представлять.

В DOM вы можете легко получить текстовые узлы с помощью Xpath и изменить их:

$xml = <<<'XML'
<set xmlns:b="urn:b" xmlns:c="urn:c" xmlns:g="urn:g">
  <a><b:x>VALUE1</b:x></a>
  <c:y>VALUE2</c:y>
  <d><e><f/><g:z>VALUE3</g:z></e></d>
  <h>VALUE4</h>
</set>
XML;

$document = new DOMDocument();
$document->loadXml($xml);
$xpath = new DOMXpath($document);

foreach ($xpath->evaluate('//text()[normalize-space() != ""]') as $textNode) {
  echo $textNode->data, "\n";
  $textNode->data = strtolower($textNode->data);
}
echo $document->saveXml();

Вывод:

VALUE1
VALUE2
VALUE3
VALUE4
<?xml version="1.0"?>
<set xmlns:b="urn:b" xmlns:c="urn:c" xmlns:g="urn:g">
  <a><b:x>value1</b:x></a>
  <c:y>value2</c:y>
  <d><e><f/><g:z>value3</g:z></e></d>
  <h>value4</h>
</set>

Выражение Xpath

Выберите любой текстовый узел в документе: //text()

Игнорировать пробельные узлы: //text()[normalize-space() != ""]

  • 0
    Спасибо!! Работает отлично!

Ещё вопросы

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