PHP: вопрос разбора XML - PullRequest
       22

PHP: вопрос разбора XML

0 голосов
/ 27 ноября 2010

Я использую SimpleXML для разбора документов XMl.Мне нужно иметь возможность читать / обновлять атрибуты узла.

В этом документе XML

<root>
  <node>ABC</node>
  <key>123</key>
  <node2>
     <key>456</key>
  </node2>
  <key>789</key>
</root>

Как я могу прочитать / обновить все ключевые узлы?документ не имеет определенной структуры, поэтому мне нужно найти их, не зная их позиции.Допустим, я хочу умножить на 2 числа в ключевых узлах.Как я могу это сделать?

Tks.

Ответы [ 3 ]

8 голосов
/ 27 ноября 2010

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

$sxe = new SimpleXmlElement($xml);
foreach($sxe->xpath('//key') as $key) $key[0] *= 2;
echo $sxe->asXML();

Существует множество вопросов о SimpleXml по переполнению стека . Пожалуйста, найдите их, прежде чем задать свой вопрос . В руководстве по PHP также есть примеры, охватывающие Основное использование .

1 голос
/ 27 ноября 2010

Самый простой из возможных API - это QueryPath (или phpQuery):

$qp = qp($xml);

foreach ($qp->find("key") as $key) {
     //@todo: add verification that it's indeed numeric text
     $key->text(  $key->text() * 2  );
}

Но что-то похожее возможно с "SimpleXML"

1 голос
/ 27 ноября 2010
<?php

$xml = '<root>
  <node>ABC</node>
  <key>123</key>
  <node2>
     <key>456</key>
  </node2>
  <key>789</key>
</root>';

$dom = new DOMDocument();
$dom->loadXml($xml);

$xpath = new DOMXPath($dom);
foreach ($xpath->query('//text()') as $node)
{
 $newNode = $dom->createDocumentFragment();
 $newNode->appendXML($node->wholeText . ' replaced');
 $node->parentNode->replaceChild($newNode, $node);
}

echo $dom->saveXML();
...