PHP: найти узел XML и вставить дочерний элемент - PullRequest
2 голосов
/ 21 января 2010

У меня есть XML-документ со следующей структурой:

<?xml version="1.0" encoding="UTF-8"?>
<items>
  <item>
    <id>1</id>
    <url>www.test.com</url>
  </item>
  <item>
    <id>2</id>
    <url>www.test2.com</url>
  </item>
</items>

Я хотел бы иметь возможность искать значение узла, например, значение 1 для поля id.Затем, как только этот узел будет найден, выберите родительский узел, который будет , и вставьте в него нового потомка.

Я знаю концепцию использования документа dom, но не уверен, как это сделать в этомэкземпляр.

Ответы [ 2 ]

4 голосов
/ 21 января 2010

Это должно быть начало:

$dom = new DOMDocument;
$dom->loadXML($input);
$ids = $dom->getElementsByTagName('id');
foreach ($ids as $id) {
  if ($id->nodeValue == '1') {
    $child = $dom->createElement('tagname');
    $child->appendChild($dom->createTextNode('some text'));
    $id->parentNode->appendChild($child);
  }
}
$xml = $dom->saveXML();

или что-то близкое к этому.

2 голосов
/ 22 января 2010

Вы можете сделать то же самое более простым способом. Вместо того, чтобы искать узел <id/>, значение которого равно 1, а затем выбирать его родителя, вы можете изменить отношение и найти любой узел, у которого есть дочерний элемент <id/>, значение которого равно 1.

Вы можете сделать это очень легко в XPath, и вот как это сделать в SimpleXML:

$items = simplexml_load_string(
    '<?xml version="1.0" encoding="UTF-8"?>
    <items>
      <item>
        <id>1</id>
        <url>www.test.com</url>
      </item>
      <item>
        <id>2</id>
        <url>www.test2.com</url>
      </item>
    </items>'
);

$nodes = $items->xpath('*[id = "1"]');
$nodes[0]->addChild('new', 'value');

echo $items->asXML();
...