1

ドキュメント内の各要素に対して解析および文字列操作を実行する必要がある一連の任意の 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 は「名前」であるため、これは失敗します。

$xml->name = strtoupper($value);

必要なとき

$xml->example->name = strtoupper($value);

ドキュメントのスキーマが変更されたため、それらすべてを処理するために汎用的なものを使用したいのですが、キーを取得する方法がわかりません。

これは Spl イテレータと simplexml で可能ですか?

4

1 に答える 1

1

おそらく、私がかつて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>

そして、それが全体の例であり、あなたの質問にも答えるはずです.

于 2013-10-31T13:21:04.393 に答える