使用PHP递归更改XML节点值

时间:2015-10-28 14:11:58

标签: php xml

我正在尝试更改" text" 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();

如何访问和操作内联值?

1 个答案:

答案 0 :(得分: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() != ""]