簡體   English   中英

PHP使用Simplexml遞歸編輯XML文檔

[英]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');
//                                     #################

這允許您進行所有標准修改(因為SimpleXMLIteratorSimpleXMLElement ),還可以進行遞歸樹遍歷以修改每個葉節點:

$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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM