- PR -

XMLファイルの順番を変更してファイルに保存

1
投稿者投稿内容
lagna
常連さん
会議室デビュー日: 2003/11/06
投稿数: 27
投稿日時: 2007-02-12 16:15
はじめまして。XMLに操作についてどうしても行き詰ってしまったので掲示板に投稿させていただきます。ご教授くださればと思います。
********a.xml********
<menus>
<menu1 id="1">
ここにはデータ1
</menu1>
<menu1 id="2">
ここにはデータ2
</menu1>
<menu1 id="3">
ここにはデータ3
</menu1>
</menus>
************************
というXMLファイルがあります。
これをPHPで、
********a.xml********
<menus>
<menu1 id="1">
ここにはデータ1
</menu1>
<menu1 id="3">
ここにはデータ3
</menu1>
<menu1 id="2">
ここにはデータ2
</menu1>
</menus>
************************
というようにmenu1の中身を丸ごと順番を入れ替えたいのです。ちなみに、データの記述部分はデータ1、データ2、データ3ともばらばらで統一がされていません(上かららすべてデータを取得して書き直すというのが、統一されてないためにできないのです)。ですので、menu1単位で、ごっそり順番を入れ替えたいのですが可能なのでしょうか?cloneNode(TRUE)等で、menu1以下のツリーをコピーして順番を入れ替えたらいいようにも思うのですがうまくいっていません。

どうぞよろしくおねがい致します。
/**********環境
OS Fedoracore5
PHP 5.0
apache 2.0





ひだちのいろ
会議室デビュー日: 2007/02/14
投稿数: 9
投稿日時: 2007-02-14 16:44
lagnaさんはじめまして。
以下のような感じになるかと思います。


<?php

// ノードを入れ替える関数
// 親が違ってもたぶんOK
// 両方に同じノードを指定するとエラー
function swapNode($node1, $node2)
{
// ノード1をノード2のコピーと入れ替え
$node1->parentNode->replaceChild($node2->cloneNode(true), $node1);
// ノード2をノード1のコピーと入れ替え
$node2->parentNode->replaceChild($node1->cloneNode(true), $node2);
}

$xml = new DomDocument();
$xml->preserveWhiteSpace = false; // 空白を無視する
$xml->load("a.xml");

$node1 = $xml->documentElement->childNodes->item(1);
$node2 = $xml->documentElement->childNodes->item(2);

// ここで入れ替えます
swapNode($node1, $node2);

$xml->save("a2.xml");
print $xml->saveXML();

?>

[ メッセージ編集済み 編集者: ひだちのいろ 編集日時 2007-02-14 16:48 ]
lagna
常連さん
会議室デビュー日: 2003/11/06
投稿数: 27
投稿日時: 2007-02-19 21:31
返答が遅くなって申し訳ありません。はじめましてひだちのいろさん。
さっそく、試してみます。
初めのうちって、見ると理解できるのですが、なかなか思いつかないですね。PHPとXMLの関係の本で新書が出てましたのでそれとにらめっこしながら勉強中です。。。先は長そうです。。。(苦笑
1

スキルアップ/キャリアアップ(JOB@IT)