Добавить узел в существующий документ XML, используя DOm и PHP

Я надеюсь, что кто-то может помочь, так как это сводит меня с ума.

Мне нужно обновить существующий файл XML с помощью PHP. Если значения в одном из узлов равны чему-то, то я хочу добавить новый дочерний элемент с некоторым текстом в нем.

Вот пример файла XML:

<properties>
  <property>
    <address>
      <street>Example Road</street>
      <locality>Fitzrovia</locality>
      <town>London</town>
      <postcode>NW1</postcode>
    </address>
  </property>
  <property>
    <address>
      <street>Default Street</street>
      <locality>Sample</locality>
      <town>London</town>
      <postcode>EC1</postcode>
    </address>
  </property>
</properties>

PHP, который у меня есть на данный момент:

$dom = new DOMDocument();
$dom->load('http://example.com/example.xml');
$xpath = new DOMXPath($dom);

$postcode = $xpath->query('property/address/postcode');
foreach($postcode as $region)
{
    $r = $region->nodeValue;
    if (preg_match('/^nw(?=[0-9]*)/i', $r)) {
        $region->nodeValue = 'North West London';
    }
    else if (preg_match('/^n(?=[0-9]*)/i', $r)) {
        $region->nodeValue = 'North London';
    }
    else if (preg_match('/^e(?=[0-9]*)/i', $r)) {
        $region->nodeValue = 'East London';
    }
    else if (preg_match('/^se(?=[0-9]*)/i', $r)) {
        $region->nodeValue = 'South East London';
    }
    else if (preg_match('/^sw(?=[0-9]*)/i', $r)) {
        $region->nodeValue = 'South West London';
    }
    else if (preg_match('/^w(?=[0-9]*)/i', $r)) {
        $region->nodeValue = 'West London';
    }
    else if (preg_match('/^ec(?=[0-9]*)/i', $r)) {
        $region->nodeValue = 'East Central London';
    }
    else if (preg_match('/^wc(?=[0-9]*)/i', $r)) {
        $region->nodeValue = 'West Central London';
    }
    else {
        $region->nodeValue = 'Outer London';
    }
}

$dom->save('export.xml');

Я пытаюсь сделать, если почтовый индекс равен определенному значению, тогда к дочернему узлу будет добавлен новый дочерний узел с некоторым текстом.

Я столкнулся с некоторыми проблемами, когда я мог получить новый дочерний узел для генерации, но он добавил бы их много и все в одну часть XML-файла, в отличие от одного isntance в каждом узле "свойства".

Я надеюсь, что это имеет смысл, поскольку я мог бы действительно сделать с некоторой помощью.

Заранее спасибо:)

1 ответ

Решение

Вы должны использовать DOMDocument::createElement для создания нового узла и DOMNode::appendChild для добавления нового узла.

Пример:

if (preg_match('/^nw(?=[0-9]*)/i', $r)) {
    $element = $dom->createElement('your_node_name', 'North West London');
    $region->parentNode->appendChild($element);
}
Другие вопросы по тегам