XMLReaderから取り出したデータのソート

このQ&Aのポイント
  • XMLデータのnewsに付加されているidの順にソートする方法を教えてください。
  • XMLデータのソート方法を知りたいです。
  • XMLReaderを使用して取り出したデータをidの順にソートする方法を教えてください。
回答を見る
  • ベストアンサー

XMLReaderから取り出したデータのソート

いつもお世話になっております。 表題の件で良いサンプルプログラムが見つからず、質問に至りました。 下記のようなXMLデータがあるとして、このnewsに付加されているidの順にソートをするにはどうすればよいでしょうか? sample.xml <topics>   <news id="1">     <head><![CDATA[<a href="#">test1</a>]]><head>     <body><![CDATA[test1]]></body>   </news>   <news id="3">     <head><![CDATA[<a href="#">test3</a>]]><head>     <body><![CDATA[test3]]></body>   </news>   <news id="2">     <head><![CDATA[<a href="#">test2</a>]]><head>     <body><![CDATA[test2]]></body>   </news> </topics> 以上、よろしくお願いいたします。

  • PHP
  • 回答数1
  • ありがとう数2

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

「私だったら」ソートが必要な場合はXSLTを使います。 例示されたサンプルの場合下記のsample.xslを作成し... <?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="xml" cdata-section-elements="head body"/> <xsl:template match="/topics"> <topics> <xsl:for-each select="news"> <xsl:sort select="@id"/> <xsl:copy-of select="."/> </xsl:for-each> </topics> </xsl:template> </xsl:stylesheet> XSLTでソートしたXMLを生成します...(php 5.2.6) $xml = new DOMDocument; $xml->load('sample.xml'); $xsl = new DOMDocument; $xsl->load('sample.xsl'); $proc = new XSLTProcessor; $proc->importStyleSheet($xsl); $sortedXml = $proc->transformToXML($xml); こんな感じで。

t_netbug
質問者

お礼

XSLの書き方がおかしいのかエラーが出てしまいます^^; 質問時には簡略していましたが、実際のXMLデータは階層がさらに深くなっていて <topics> <news id="no0001"> <target> <deny>*</deny> <allow>1,3,5</allow> </target> <message> <head><![CDATA[]]></head> <body><![CDATA[]]></body> </message> </news> </topics> のようになっています。 この場合、XSLの書き方は <?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="xml" /> <xsl:template match="/topics"> <topics> <xsl:for-each select="news"> <xsl:sort select="@id"/> <xsl:copy-of select="."/> </xsl:for-each> </topics> </xsl:template> </xsl:stylesheet> ではダメなのでしょうか?

t_netbug
質問者

補足

チェックが遅くなり申し訳ありません。 ありがとうございます、上記方法でコーディングしてみます。 不明点などが出るかもしれないので、締め切りは無事解決後にさせて頂きます。

関連するQ&A

  • URLに引数を渡す良い方法

    お世話になっております。 URLに動的に引数を渡したいのですが、効率のよい方法が思いつきません。 <a href="/?1=1<?($id)?'&id='.$id:'')?><?($page>0)?'&page='.$page+1:'')?>&sort=created">最新順</a> <a href="/?1=1<?($id)?'&id='.$id:'')?><?($page>0)?'&page='.$page+1:'')?>&sort=popular">人気順</a> <a href="/?1=1<?($id)?'&id='.$id:'')?><?($page>0)?'&page='.$page+1:'')?>&sort=comment">コメント順</a> このように見づらいコードになってしまいます。 みなさんはどのような方法で解決されているでしょうか?

    • ベストアンサー
    • PHP
  • jQueryでxmlを読み込んで、五十音順にソート

    jQueryでxmlを読み込んで、五十音順にソート qa6111214でjQueryでXMLを操作する方法について質問させていただいた者です。 たびたび申し訳有りません。質問させていただきます。 jQueryでxmlで読み込んで、五十音順にソートしたいのですが方法がわかりません。 ---------------------------------------------------------------------------------------------------- <data> <item> <link>hoge1.html</link> <name>山田 太郎</name> <syllabary>やまだたろう</syllabary> </item> <item> <link>hoge2.html</link> <name>山田 花子</name> <syllabary>やまだはなこ</syllabary> </item> <item> <link>hoge3.html</link> <name>田中 太郎</name> <syllabary>たなかたろう</syllabary> </item> <item> <link>hoge4.html</link> <name>田中 花子</name> <syllabary>たなかはなこ</syllabary> </item> <item> <link>hoge5.html</link> <name>鈴木 太郎</name> <syllabary>すずきたろう</syllabary> </item> <item> <link>hoge6.html</link> <name>鈴木 花子</name> <syllabary>すずきはなこ</syllabary> </item> </data> ------------------------------------------------------------------------------------------------ というxmlデータをjQueryで読み込んで、五十音順にソートして表示する方法を探しています。 例えば…… ------------------------------------------------------------------------------------------------ <a href="hoge5.html">鈴木 太郎</a> <a href="hoge6.html">鈴木 花子</a> <a href="hoge3.html">田中 太郎</a> <a href="hoge4.html">田中 花子</a> <a href="hoge1.html">山田 太郎</a> <a href="hoge2.html">山田 花子</a> ------------------------------------------------------------------------------------------------ といった具合に書き出したいのですが…… ご教授願います。また、参考になりそうな書籍/サイトはありますでしょうか。 宜しくお願い致します。

  • XML::DOM / XML::XPathでソート

    XML::DOMで効率的なソートの方法はどんなものがありますでしょうか。 一応動くものは作れたのですが、効率的とは言い難く、しかも ソート項目が一意のデータでないといけないという欠点があります。 ############################################### use XML::DOM::XPath; my $xml = <<EOM; <?xml version="1.0" encoding="UTF-8" ?> <list> <item id="10">Apple</item> <item id="5">Orange</item> <item id="20">Melon</item> </list> EOM my $parser = XML::DOM::Parser->new(); my $doc = $parser->parse( $xml ); ## <item>タグの一覧を作成 my @list = $doc->findnodes('/list/item'); ## <item>タグ id属性一覧を作成 my @idlist = map{ $_->getAttribute("id") } @list; ## id属性順にソート foreach my $id ( sort{ $a<=>$b } @idlist ){ ## id属性値を指定してノードリストを取得 my @item = $doc->findnodes('/list/item[@id='.$id.']'); ## idは一意なのでリストの先頭で固定 print $item[0]->getAttribute('id')."\n"; print $item[0]->getFirstChild->getNodeValue."\n"; } ############################################### ハッシュなら sort{ $hoe{$b} <=> $hoe{$a} } keys %hoe といった方法があるのですが、XML::DOMの場合は同じようにいきません。 良い方法がありましたらお願いします。

    • ベストアンサー
    • Perl
  • 文字列置換方法

    いつもお世話になっております。 早速質問なんですが、 ページの読み込み先によってページの文字を変更したいのですがよい方法は ないでしょうか? 例) <test10.html> <HTML> <head> </head> <body> <form name="main"> <a href="test11.html">移動1</a> </form> <a href="test12.html">ログインします</a> </body> </HTML> <test11.html> <HTML> <head> </head> <body> <form name="before"> 登録前です。 </form> </body> </HTML> <test12.html> <HTML> <head> </head> <body> <form name="after"> 登録後です。 </form> <a href="test10.html">トップに戻ります。</a> </body> </HTML> test12.htmlのページからtest.html10に戻った場合、 <a href="test11.html">移動1</a>を<a href="test13.html">移動2</a> <a href="test12.html">ログインします</a>を<a href="test14.html">ログアウトします。 と別の文字列に置換したいのですが可能でしょうか? 何かよい方法があればご教授願います。 javascriptでよい方法があれば幸いです。 よろしくお願いいたします。

  • 検索のソートについて

    以前phpのカテゴリ内で以下のようなQ&Aをみつけましたが、まったく同じ状況で使用する言語がperlの場合どのようにすればいいのでしょうか?どなたか教えて下さい。 "PHP+MySQLを勉強中です。 例えば、商品テーブルに商品ID、商品名、価格、在庫数の4つのフィールドがあって、その表の各名称をクリックするとソート(例:オークションなどで現在価格をクリックするとソートなど[select * from 商品 order by 価格 asc])できるスクリプトをどのように作成すればよいか教えて下さい。" "shohin.phpで商品一覧を表示するとして、フィールド各名称のリンクを <a href="shohin.php?sort=1">商品ID</a><a href="shohin.php?sort=2">商品名</a>・・・ のようにします。" あとはswitch文を使ってget値(sort=の値)別にクエリーを変えるだけです。

    • ベストアンサー
    • Perl
  • ネットスケープでも動せるスクリプト

    失礼します。 現在ホームページ作成で、リンクの色を変える方法で悩んでいます。 テストで下記のようなスクリプトをテストで組んでみたのですが、 色々と調べたところNNでdocument.allという部分が未対応のようで NNでだけ、表示をすることができません。 自分は、ジャバスクリプトを1から組むことができず、 色々なサイトで調べてまわり、サンプルをさわってみたのですが うまくいかずにこまっています。 なんとか、IE,NN、firefoxの3ブラウザで見られるようにするには どうすればよいでしょうか? 宜しくお願いします。 ※ソースをみていただけるとわかるとおもうのですが、できれば任意で ID等ををふって、好きなだけリンクが作れると助かります。 ~HTML~ <html> <head> <title>リンクカラーテスト</title> <script Language="JavaScript"> <!-- function test(ID,col) { document.all[ID].style.color = col; } // --> </script> </head> <body> <a href="#" onMouseover="test('id1','red')" onMouseout="test('id1','black')">リンク元1</a ><br> <a href="#" onMouseover="test('id2','orange')" onMouseout="test('id2','black')">リンク元2</a > <p><br> </p> <p id="id1">リンクカラー1</p> <p id="id2">リンクカラー2</p> </body> </html>

  • frameでのcssの変更する方法

    frameを使ってmain.html、menu.htmlを表示し、menu.htmlからmain.htmlのcss(外部)を変更する方法を教えてください。 frameのnameはmain.html→main、menu.html→menu、main.htmlのcssのidはmain、で指定してあります。 以下サンプルです frame.html <html> <head> </head> <frameset rows="50,*"> <frame src=main.html name="main"> <frame src=menu.html name="menu"> </frameset> </html> main.html <html> <head> <link rel="stylesheet" type="text/css" href="a.css" id="main"> ←(a.cssをb.css変更したい) </head> <body> </body> </html> menu.html <html> <head> </head> <body> </body> <a href="#">変更トリガー</a> </html>

  • 関数内でonclickをさせたい

    以下に示すような動作をさせたいのですが、手段はあるでしょうか? ご教示の方よろしくお願いいたします。 <html> <head> <script type="text/javascript"> function test1(){ ここでtest2というリンクをクリックしたことにしたい。 document.getElementById("test2").onclickとか勘でやってみたけどダメでした。 } </script> </head> <body> <img src="hoge.jpg" name="test1" onclick="test1();"> <a href="hoge.html" id="test2">test2</a> </body> </html>

  • 指定位置に要素を追加する

    <script type="text/javascript"> function test(){ var hako2 = document.createElement('div'); hako1.innerHTML = "TEST2"; var lk2 = document.getElementById('link2'); var li2 = lk2.parentNode; li2.appendChild(hako2); } </script> </head> <body> <div><a href="1" id="link1">1</a></div> <div><a href="2" id="link2">2</a></div> <div><a href="3" id="link3">3</a></div> <input type="button" onclick="test()" value="test"> </body> みたいなイメージなのですが、いかんせんスマートじゃありません できれば<div>で<a>を囲うのをやめたいのです。 ターゲットになる<a>の位置は固定ではなく前後に他の要素が入ることもあります <a href="2" id="link2">2</a>の次に<div>TEST2</div>を生成できればどんなのでも?いいのですが、何かいいやり方ありませんか?

  • STLのList.sortが上手く使えない

    VC++2005のSTLの、List.sort()を使ってメンバ変数aでソートしたいのですが上手くいきません。 MSDNで"IComparerをオーバーロードしろ"と、書いてあったのを見て、 いろいろ調べて試してはみたのですが、理解不足のため全て失敗しました。 ネットに転がっているサンプルはC#のモノばかりでサッパリです。 調べる手段も分からず八方塞な状態です。どうかお力を貸してください。お願いします。 class TestList { protected: std::list<TestList*> RunList; int a; //この変数でソートする public: MakeList(TestList *test); //リストを"RunList"に登録する }; void main() { TestList Test(); //全てのリストはココに登録 Test->MakeList(new TestList()); Test->MakeList(new TestList()); Test->RunList.sort(); //←ココ。メンバ変数aでソートしたい } 【追記】MSDNの方法では"mscorlib.dll"が必要になります。 もし可能なら違う方法になったとしても、使うことなくソートできるなら、その方が良いです。

専門家に質問してみよう