[英]PHP Recursively Edit XML Document with Simplexml
我有一系列任意的XML文檔,我需要解析它們並對文檔中的每個元素執行一些字符串操作。
例如:
<sample>
<example>
<name>David</name>
<age>21</age>
</example>
</sample>
對於節點的名稱和年齡,我可能想通過諸如strtoupper之類的功能運行它以更改大小寫。
我正在竭盡全力地做到這一點。 我一直在嘗試將RecursiveIteratorIterator與SimpleXMLIterator一起使用來實現此目的,但是我無法獲取父鍵來更新xml文檔:
$iterator = new RecursiveIteratorIterator(new SimpleXMLIterator($xml->asXML()));
foreach ($iterator as $k=> $v) {
$iterator->$k = strtoupper($v);
}
失敗是因為在這個例子中$ k是'name',所以它試圖這樣做:
$xml->name = strtoupper($value);
什么時候需要
$xml->example->name = strtoupper($value);
隨着文檔架構的更改,我想使用通用的東西來處理它們,但是我不知道如何獲取密鑰。
使用Spl迭代器和simplexml是否可能?
您最有可能在尋找我曾經寫過SimpleXML-Self-Reference的東西。 它在這里也起作用。
是的,Simplexml支持SPL和RecursiveIteratorIterator
。
因此,首先,您可以通過以下方式打開原始XML,直接使$xml
與樹遍歷一起工作:
$buffer = <<<BUFFER
<sample>
<example>
<name>David</name>
<age>21</age>
</example>
</sample>
BUFFER;
$xml = simplexml_load_string($buffer, 'SimpleXMLIterator');
// #################
這允許您進行所有標准修改(因為SimpleXMLIterator
和SimpleXMLElement
),還可以進行遞歸樹遍歷以修改每個葉節點:
$iterator = new RecursiveIteratorIterator($xml);
foreach ($iterator as $node) {
$node[0] = strtoupper($node);
// ###
}
在所有葉節點上進行的示例性遞歸迭代顯示了如何設置自引用,此處的關鍵是將其分配給$node[0]
,如上面的鏈接所述。
所以剩下的就是輸出:
$xml->asXML('php://output');
然后簡單地給出:
<?xml version="1.0"?>
<sample>
<example>
<name>DAVID</name>
<age>21</age>
</example>
</sample>
這就是整個示例,它也應該回答您的問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.