ログインしてさらにmixiを楽しもう

コメントを投稿して情報交換!
更新通知を受け取って、最新情報をゲット!

XMLコミュの質問トピック

  • mixiチェック
  • このエントリーをはてなブックマークに追加
わざわざトピックを作成するほどではない質問はこちらへどうぞ。

コメント(52)

本の内容の階層とと物理的な階層を一つのXMLファイル内で表現するには、
行を”最大公約数”として、図で言うと黒行と灰色行の切り替わりごとにマークアップすればよいという事でしょうか。
XSLTを2日前に始めた初心者です。

現在、webベースの簡易検索システムを作ろうとしているのですが、検索結果が多すぎる場合があるので、一定数で表示を制限しようとしています。

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method='html' version='1.0' encoding='UTF-8' indent='yes'/>
<xsl:param name="items_per_page"/>
<xsl:param name="query_state"/>

<xsl:template match="/">
<html>
<body>
 <table rules="all" border="1">
  <xsl:for-each select="catalog/pr">
   <xsl:if test="$query_state='all' or contains(state, $query_state)">
   <xsl:if test="$items_per_page ='all' or position() <= $items_per_page">
   <tr>
    <td align="center"><xsl:number /></td>
    <td><xsl:value-of select="name"/>
    <td><xsl:value-of select="state"/>
   </tr>
   </xsl:if>
   </xsl:if>
  </xsl:for-each>
 </table>
</body>
</html>
</xsl:template>

</xsl:stylesheet>

上記、$items_per_pageで、表示数を制限しているつもりなのですが、これだと、どうやら、検索数に制限がかかってしまっているようです。例えば、items_per_page = 50の場合、

a) 検索結果のうち、50個を表示
ではなく、
b) 50個の元データのうち、検索結果に合致したアイテムすべてを表示

になってしまいます。

参考書によると、このような場合は、<xsl:copy>を使って、検索結果を別ノードへコピーし、表示は別のテンプレートで行うと良い、みたいなことが書いてあったのですが、どうも使い方が良く分かりません。

皆様のアドバイスをいただきたく、投稿させていただきました。
> 15

整形式の XSLT ではないのに、これでよく動いてますね。
td 要素の終了タグがないところがあります。

それと、できれば、XML のほうのサンプルも掲載していただけませんか?
> 15

まだ試していませんが、おそらく下記でいけると思います。
Unified Diff 形式で掲載します。

@@ -9,20 +9,27 @@
<html>
<body>
<table rules="all" border="1">
- <xsl:for-each select="catalog/pr">
- <xsl:if test="$query_state='all' or contains(state, $query_state)">
- <xsl:if test="$items_per_page ='all' or position() <= $items_per_page">
- <tr>
- <td align="center"><xsl:number /></td>
- <td><xsl:value-of select="name"/></td>
- <td><xsl:value-of select="state"/></td>
- </tr>
- </xsl:if>
- </xsl:if>
- </xsl:for-each>
+ <xsl:choose>
+ <xsl:when test="$query_state='all'">
+ <xsl:apply-templates select="catalog/pr"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="catalog/pr[contains(state, $query_state)]"/>
+ </xsl:otherwise>
+ </xsl:choose>
</table>
</body>
</html>
</xsl:template>

+ <xsl:template match="catalog/pr">
+ <xsl:if test="$items_per_page ='all' or position() <= $items_per_page">
+ <tr>
+ <td align="center"><xsl:number /></td>
+ <td><xsl:value-of select="name"/></td>
+ <td><xsl:value-of select="state"/></td>
+ </tr>
+ </xsl:if>
+ </xsl:template>
+
</xsl:stylesheet>
> 15

できました。http://d.hatena.ne.jp/kageroh_/20090209/1234146001
number は 1 から振りたいのだろうなーと勝手に想像して直しました。
kageroh様、 早速のアドバイスありがとうございます。 18のプログラム、大変参考になりました。あわせて、numberの振り直しもありがとうございます。

 さて、いただいた改造中、下記は高速化のためでしょうか?

- <xsl:if test="$query_state='all' or contains(state, $query_state)">
+ <xsl:choose>
+ <xsl:when test="$query_state='all'">
...
+ </xsl:choose>

 というのは、このままでは、IE6.0でうまく動作しなかったので、
<xsl:if test="$query_state='all'">
<xsl:apply-templates select="catalog/pr"/>
</xsl:if>
<xsl:if test="$query_state !='all'">
<xsl:apply-templates select="catalog/pr[contains(state, $query_state)]"/>
</xsl:if>
のように書き換えてみました。ちょっと試した感じでは、これでうまく動いているようです。

 # 元のままだと、VS2005のエディタが、
 xsl:chose cannot a child of 'table' element
とエラー表示しました。
> さて、いただいた改造中、下記は高速化のためでしょうか?

あ、いえ、単に条件分岐です。if 2 回よりは評価回数が少ないので、速くなるとは思います。

> xsl:chose cannot a child of 'table' element

あらら。たぶん、コピペで入れ子関係がおかしくなったのではないかと。
diff 形式で載せなければよかったですね。
http://d.hatena.ne.jp/kageroh_/20090209/1234146001 に書いたコードは、
msxsl.exe という MicroSoft 製のもので動いているので、VS2005 でも問題ないと思います。
> たぶん、コピペで入れ子関係がおかしくなったのではないかと。

失礼しました。今朝、気を改めて試したところ、問題なく動作しました。
ご指摘のように、コピペを失敗していたのかもしれません。

おかげさまで、簡易データベースを構築することができました。 ありがとうございました。
再び、お世話になります。

kageroh様のおかげで、簡易データベースが動くようになりました。

現在、少し欲を出して、検索結果が、1ページに収まらない場合、テーブルの下に、

 Page 1, 2, 3,

のようなURLを足そうかと思っています。これを行うには、

 ページ数 = 検索結果の数 / 一ページあたりの表示数

を計算する必要があります。

試してみたところ、下記のようなXLSで、 変数"number_of_hit_pr"に、
検索結果の数が入るようです。

 ただ、このようなコードだと、検索を2回行っているような気がして、
処理時間がもったいない気がします。

 検索結果を、一時的に、変数などに退避して置き、ページ計算と
テーブルの表示で、共有する方法は、XSLTに存在するのでしょうか?


xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method='html' version='1.0' encoding='UTF-8' indent='yes'/>
<xsl:param name='query_keyword'/>
<xsl:param name="query_state"/>
<xsl:param name="query_category"/>
<xsl:param name="query_page"/>

<xsl:template match="/">
<xsl:variable name='number_of_hit_pr' select="count(catalog/pr[
($query_keyword = '' or contains(title, $query_keyword))
and ($query_state = 'all' or $query_state=state)
and ($query_category = 'all' or cat=$query_category)])"/>

<xsl:value-of select="$number_of_hit_pr"/>

<table>
<title>_</title>
<xsl:apply-templates select="catalog/pr[
($query_keyword = '' or contains(title, $query_keyword))
and ($query_state = 'all' or $query_state=state)
and ($query_category = 'all' or cat=$query_category)]"/>
</table>
</xsl:template>

<xsl:template match="catalog/pr">
   <xsl:if test="$query_page ='all' or position() <= $query_page">
   <tr>
    <td align="center"><xsl:value-of select="position()"/> </td>
    <td><xsl:value-of select="id"/> </td>
    <td><xsl:value-of select="name"/> </td>
    <td><xsl:value-of select="state"/> </td>
    <td><xsl:value-of select="cat"/> </td>
   </tr>
</xsl:if>
</xsl:template>

</xsl:stylesheet>
>> 22

> 検索結果を、一時的に、変数などに退避して置き、ページ計算と
> テーブルの表示で、共有する方法は、XSLTに存在するのでしょうか?

あります。グローバル変数に入れておくのが簡単と思います。
グローバルを汚染したくなければ、with-param で渡してもよいです。
http://d.hatena.ne.jp/kageroh_/20090212/1234422228
kageroh様、

 サンプルプログラムまで、作っていただきありがとうございます。

 なるほど、<xsl:variable>は、スカラー量だけでなく、配列(?)も格納できるのですね。 そんなに大きなプログラムではないので、グローバル変数を使いたいと思います。
>> 24

補足です。

[($query_keyword = '' or contains(title, $query_keyword)) and ($query_state = 'all' or $query_state=state) and ($query_category = 'all' or cat=$query_category)]

and の場合、式の評価順が XSLT プロセッサ依存となっているそうです。
($query_category = 'all' or cat=$query_category) から評価されることも有り得ます。

[$query_keyword = '' or contains(title, $query_keyword)][$query_state = 'all' or $query_state=state][$query_category = 'all' or cat=$query_category]

このように書くと、左から順に評価されていきます。ご参考まで。
質問です。

FLASHから外部XMLで外部JPEGを読み込んでリンク先を割り当てることはできるのですが、
そのリンクのターゲット指定ができません。

FLASH側で(現在は.txtファイルから読み出していますが)

this.swapDepths(10);//外部JPGを読み込む空のMCよりも、深い深度値を設定し、前面に表示させる
var theX = waku_mc._x=0;
var theY = waku_mc._y=0;
//var A = moji1._alpha=moji2._alpha=moji3._alpha=moji4._alpha=40;//_alpha値の初期値は、50とする
var Check:Boolean = true;//Waku(Y:Number)が実行されるかどうかの制御変数で、初期値は、trueで、実行
/*MENU-1の処理*/
a_mc.onRollOver = function():Void {//ロールオーバーされたら、
_root.t_mc.t_txt.text="停止";
Check = false;//自動処理停止し、
Waku(a_mc._x);//カスタム関数実行
};
a_mc.onRollOut = function():Void {//ロールアウトされたら、
_root.t_mc.t_txt.text="自動処理再開";
Check = true;//自動処理を再開し、
n = 0;//Y軸座標を、a_mc._yの位置、即ち、カウンターのn=0の位置とする
};
a_mc.onRelease = function():Void {//クリックされたら、
getURL(_root.list[0], "_blank");//リストに記載されている0番のURLを開く
};

と、指定しているのですが、getURL(_root.list[0], "_blank")
の"_blank"の部分を外部に持っていくことはできないのでしょうか?

どなたかご教授お願いいたします。
質問です

独自のマークアップ言語を作るのと、XMLを利用するのとどう違いますか?
>> 27
マジレスすると、用途によります。用途次第では.iniファイルでいい。プログラミング言語だってoreore言語でいいのです。
こんにちは。
XMLでフォントスタイルを変えようと思ってるんですが、
なぜか、文字が消えてしまいます。

<?xml version="1.0" encoding="UTF-8"?>
<about_data>
<about>
<text><![CDATA[Shoichi Manabe]]></text>

このShoichi Manabeのところが、
表示させると常に大文字でフォントを指定しても
何も変化しないんです。

試してみたのは、

<text><![CDATA[<font face="Century Gothic"Shoichi Manabe</font>]]

<text><![CDATA[font-family:'Century Gothic"Shoichi Manabe]]

の二つです。
ちょっとしたのほうは、うろ覚えなのですが。。

文字の消失ですが、IEとFOXの両方で試してみたのですが、
同様の症状が起こりました。

もしよければ、アイデアをいただけると幸いです。
 はじめまして。
XMLの使用について質問失礼します。

例えば音楽の「タイトル」「レーベル」「ジャンル」「発売年代」のような作品情報を持つデータ群がある場合
XMLで作品個々の情報を管理・追加していきXSLT→HTMLとして
個々の情報を表示するページ、同ジャンルだけを集めたページ、同じ月に発売された作品だけを集めたページなどを、WEB上で公開するようなことを目的として作成することは可能でしょうか?
PHPなどを使用したほうが早い、などはとりあえず置いておいた話です。

例)
<work>
 <title>作品タイトル</title>
 <label>レーベル</label>
 <genre>ジャンル</genre>
 <date>1999/06</date>
</work>

このような情報を持つ複数の作品情報XMLを用意します。
label.xml や genre.xmlなどの別XMLファイルを用意して、そこへ作品情報XMLをマージしていけば良いのでしょうか?
それとも個々の作品XMLとするのではなく、単一で全ての商品情報を載せたXMLを作成して
そこから抜き出したほうが良いのでしょうか?
扱う作品が膨大な場合、全てを単一のXMLで扱ってしまうとデータ量が大きくなって悪影響などでそうな気がするのですが、そういうことは無いのでしょうか。


また、ENTITYでマージをするとIE以外では情報を呼び出せない場合があるのですが、これは自分のミスでしょうか・・・。
拙い質問となってしまいましたが、どうぞよろしくお願いいたします。
>> 30
はじめまして。

> XMLで作品個々の情報を管理・追加していきXSLT→HTMLとして
> 個々の情報を表示するページ、同ジャンルだけを集めたページ、同じ月に発売された作品だけを集めたページなどを、WEB上で公開するようなことを目的として作成することは可能でしょうか?

 可能です。個々の情報を出力するXSLT、同ジャンルを集めるXSLT等々、XSLTを複数用意したり、XSLTにパラメータを渡して条件分岐する方法などがあると思います。

 条件分岐の例:
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:param name="mode" />
<xsl:template match="/">
<xsl:choose>
<xsl:when test="$mode = 'genre'">
<!-- 同ジャンルを集める(以下略) -->

 XSLTへパラメータを渡すには(PHPのXSLTプロセッサを使う場合)
http://php.net/manual/ja/xsltprocessor.setparameter.php

> label.xml や genre.xmlなどの別XMLファイルを用意して、そこへ作品情報XMLをマージしていけば良いのでしょうか?
> それとも個々の作品XMLとするのではなく、単一で全ての商品情報を載せたXMLを作成して
> そこから抜き出したほうが良いのでしょうか?

 個々の作品XMLを用意しておけば、全ての商品情報を載せたXMLを作成することもできますので、後々管理し易いように設計したほうが良いと思います。

 work1.xml:
<work>
<title>作品タイトル</title>
<label>レーベル</label>
<genre>ジャンル</genre>
<date>1999/06</date>
</work>

 all.xml:
<!DOCTYPE works [
<!ENTITY work1 SYSTEM "work1.xml">
]>
<works>
&work1;
</works>

 ご参考:
http://www.atmarkit.co.jp/fxml/tecs/007entity/07.html

> 扱う作品が膨大な場合、全てを単一のXMLで扱ってしまうとデータ量が大きくなって悪影響などでそうな気がするのですが、そういうことは無いのでしょうか。

 単一は単一で便利ですが、やはりそう言った悪影響は出ます。深刻な場合、ファイル管理ではなく、データベース導入などを考えなければなりません。
 フリーのネイティブXMLDB:
http://exist-db.org/

> また、ENTITYでマージをするとIE以外では情報を呼び出せない場合があるのですが、これは自分のミスでしょうか・・・。

 いえ、セキュリティのためです。小生の知るWebブラウザのなかでは、IE以外では外部実体ファイルは呼び出せなくなっています。IEはMSXML4を内部的に使っているのだと思いますが、MSXML6からはやはりセキュリティのため外部実体ファイルが呼び出せなくなりました。

 ENTITYを使わずにXSLTのdocument関数を使うという手もあります。
http://www.asahi-net.or.jp/~PS8A-OKZK/xml/xslt10_2/document.html
>> 29
主要なWebブラウザは、XML文書をツリー表示するようにスタイルが関連付けられています。自分で定義したスタイルを適用するには、スタイルシートを埋め込まなければなりません。

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="sample.css" type="text/css"?>
<about_data>
<about>
<text><![CDATA[Shoichi Manabe]]></text>
</about>
</about_data>

 sample.css:
@charset 'utf-8';
text {
font-family: "Century Gothic", sans-serif;
}
>>kagerohさん

 はじめまして。
回答ありがとうございます。
まだXMLを始めたばかりですが、周りに相談できる人がいなくて困っていたので大変助かりました。
頂いた情報を元に理解していこうと思います。
ありがとうございました。
 お疲れ様です。
前回こちらで質問させていただきました。
その際に教えていただいた部分について質問させていただきます。

「作品データを個別のXMLに記述して、それら複数のXMLデータをマージし特定の要素を取り出し、XSLTでHTMLとする」
についてですが

>>小生の知るWebブラウザのなかでは、IE以外では外部実体ファイルは呼び出せなくなっています。

との回答をいただきました。
以下のように書いていただいたコードを

 all.xml:
<!DOCTYPE works [
<!ENTITY work1 SYSTEM "work1.xml">
]>
<works>
&work1;
</works>

ではENTITYで外部実体ファイルを呼びだしているのでIE以外では利用できないということですよね。
ということで自分がやろうとしていることは、一般的な複数のブラウザの使用を想定した場合ENTITYは使用できず、document関数でのみ対応できるということでよろしいでしょうか?
こんにちは。お疲れさまです。

> 一般的な複数のブラウザの使用を想定した場合ENTITYは使用できず、document関数でのみ対応できるということでよろしいでしょうか?

HTMLへの変換は前もって済ませておき、HTML文書だけをブラウザで読む、と前回は解釈しておりました。XSLT処理もブラウザで行うことを想定しているのでしたら、おっしゃるとおりです。言葉が足りず、失礼致しました。
>>kagerohさん

 こんにちは。
今回も丁寧なご回答ありがとうございます。
まだ始めたばかりなので、ENTITYが使用できないとイマイチ作成の手順がイメージできないのですが
自分が求める機能(商品個別情報をXMLデータとして、そのデータ群をまとめたり抽出したりして個別ページやリストページを作成する)はXHTML / XSLT で行うには不向きということでは無いでしょうか。

 「XHMLでも頑張ればできるけど、別にわざわざXHMLでやらなくても良いのでは?」

 「XHTMLの理にかなっているが、制作者の知識不足でイメージできていない。」

現状どちらなのかが自分では分かりかねています。
今後の学習の指針にもしたいのでよろしくお願いいたします。
やはりデータ量が多くなると、ファイルで管理するのは大変です。Web公開とブラウザでのXSLT処理が前提でしたら、個別データ毎の閲覧はともかく、同ジャンルで集めたりするとなると、キャッシュがなければ毎回すべての個別データを受信しなければならず、さらには複雑なXSLT処理を閲覧者環境で行わせてしまうことになります。

Web公開ということでしたら、データ形式がXHTMLというのは理にはかなっていますし、XML/XSLTを利用することはXHTMLとの相性が良いでしょう。しかし「同じジャンルを集める」などの処理はサーバサイドで行うのが現実的かと思います。サーバサイドでの処理は、もちろんXSLTも有効ですし、XSLTの機能が合わなければ(またはサービス構築者が扱いにくい言語であれば)、ほかの選択肢も考えられます。

専門用語になってしまいますが、「REST」などXMLデータを通信でやり取りする方法が現在利用されています。これは大まかに言うと、クライアントからのリクエストを受け、リクエストをサーバで処理し、処理結果をXML形式でクライアントに送るというものです。サービス利用者は、送られてくるXMLのタグ名などをサービス提供者から与えられていますから、必要なデータを必要な分だけ取得し、適切に利用することができます。たとえば、この必要なデータだけをクライアントでXSLT処理をさせるというのも一つの手ではないでしょうか。

長くなってしまいました。伝わらないところも多いかと思いますが、何かしらのお役に立てれば幸いです。不明瞭なところはお手数ですが、ご質問いただきたく。
>>kagerohさん

 こんにちは。
丁寧なご回答ありがとうございます。
上の例で言うと「同じレーベル」だけでXMLファイルを作成し、その中に各作品情報を保存。
そのレーベルごとに作品を管理し適宜呼び出し利用する形が良いような気がしてきました。
ただkagerohさんのお話を伺って、やはりまず私のXML / XSLT の理解をより深めなければならないように感じました。
サーバー側の処理とクライアント側の処理の住み分けなどの基本もまだまだ足りていないようです。
ご紹介いただいたRESTなどの便利な手段も後々触ることができるよう、着実に基礎知識を増やしていこうかと思います。
kagerohさんには親切にご指導いただき大変感謝しております。

また何かの際にはkagerohさんはじめ、皆さまよろしくお願いいたします。
>> 39
みかんさん、はじめまして。

電子カルテはMedical Markup Language(MML)というXML形式の規格を使うことになっています。MMLはMedXMLコンソーシアムで決められています。
http://www.medxml.net/

MMLは、人間がパソコンのキーボードを叩いて記述するようなものではなく、タッチペンや音声などを使ってコンピュータに入力することが想定されていると思います。

そのため、電子カルテに携わると言っても、電子カルテを実際に使う医療機関での仕事なのか(A)、そういった医療機関に電子カルテ関連のシステムを導入するハードウェア/ソフトウェア開発の仕事なのか(B)、或いはそのほか、携わり方によって必要な情報は変わってきます。

たとえば、上述の(A)の場合でしたら、XMLコミュニティではなく、ほかで訊いてみてください。電子カルテに関する本は幾つか出ているようです。
http://www.amazon.co.jp/s/ref=nb_ss?__mk_ja_JP=%83J%83%5E%83J%83i&url=search-alias%3Dstripbooks&field-keywords=%93d%8Eq%83J%83%8B%83e&x=0&y=0

(B)の場合でしたら、本ではなく、MedXMLコンソーシアムで規格を読んでみてください。同サイトのリンクからは実装事例なども知ることができるようです。
http://www.medxml.net/case/case.html

私も以前、MMLを利用したサービスに関わることができそうな機会があったのですが、残念ながら未だ医療機関での導入事例が少なく、その話は保留になってしまいました。電子カルテの理念は良いものだと思っています。
追記です。

XMLそのものを知るための本でしたら、私は次の二冊が好きです。少し古い本ですので、現在は仕様が変わっているところもあります。そのあたりは、XML仕様を決めているW3C(http://www.w3.org/)などから最新情報を得る必要があります。

http://www.amazon.co.jp/dp/4774111864/
http://www.amazon.co.jp/dp/4774113026/
すいません、ドシロウトです。
30、31の質問/回答が非常に参考にはなったのですが、もう少しレベルを下げて教えてください。



ローリング・ストーンズのファンページを作りたいと思ってます。
CDジャケットをWEBページにズラーッと一覧表示させたいのですが、ストーンズは膨大の数の作品がありますので・・・
Amazon Web Serviceで画像情報を一括取得して、今用意してるHTMLファイルに一気に流し込めないかと模索中です。
(アフィは検索に嫌われるらしいのでつけなくてもいいと思ってますが、買うひとのために画像リンク自体はほしいです)


ところが、XMLというものがよくわからず、数日勉強した結果、こんな流れのイメージを持ちました。
でも、どこか間違ってる気もするのです…。


・HTML/CSSでWEBデザインを決めておき、
ジャケットを表示させたいところは■な感じで空欄にしておく

・AWSに画像情報をリクエストし、xml形式でデータを送ってもらう

-------------------------
(ここからが特にわからない)
-------------------------
・XMLファイルをPHPなどのプログラムで、
HTML/CSSファイル内の■部分に情報が送られるように加工する?(XSLTというものはこれ??)

・その2つのファイルをサーバーの同じディレクトリに突っ込む??



ここにいらっしゃる方にとっては、あきれるほど初歩的どころか根本的に間違ってるかもしれませんが、
何かヒントだけでも教えていただけたら幸いです。

本や参考URLの紹介だけでもかまいません。
このあたりが参考になるかもしれません。取り急ぎ。
http://www.ajaxtower.jp/ecs/
若干ニュアンスが違うような気もしますが、実際動かせばすぐわかるので気にするほどでもないかな

受け取ったxmlをhtmlに変換するのに、xsltやらphpやら色々と方法があります

今から覚えて気楽に使うのであれば、phpがいいと思います
書籍や参考サイトも豊富ですから

サーバがphp5で動かせるのであればですが
「SimpleXML」で調べてみてください


------
http://bitga.info/top/Music.php
暇つぶし兼、勉強兼、実験で弄っているサイトです
(最近いそがしくて放置なんですがw)

Rolling Stones と入れて検索してみてください
amazon api に検索リクエストを送って、返ってきたxmlをphpで加工してます

下の方にずらずらと出てきてるのが、xmlデータの一部です
それから必要な部分を抜き出して、htmlに埋め込んでいくイメージで、phpファイル1枚でできます

amasawaさん、Quaさん、ありがとうございました。
非常に参考になります。

検索機能をつける気はまるでなかったのですが、少し気になりだしました。



いま「やさしいXML」を読んでるところなので、
道のりは長そうですが…
やりたいことに対して、xmlの知識はそう必要ないですよ
あった方がいいでしょうが、基本的な構造がわかっていれば、あとはphpやら利用しようとするプログラミングの知識のほうがよほど必要です

xmlから探るよりは、そちらから調べた方が近道だと思いますよ
たびたびありがとうございます。


そうですね、やっとなんとなく、何をすれば最短距離で目的のものができるのかぼんやり見えてきました。

DOMの章を読むのをちょっと待って(笑)、PHP5を探ってみようかと思います。
結果、遠回りどころか近道になりそうですね。
宜しくお願い致します。

早速質問になります。

まず、下記のようなXMLがあるとします。

<LIST>

<FILE_LIST REQUESTPATH="\\su-san\top">

<FOLDER name="folder1" size="nonebyte" time="2010/05/12 19:13:32">

<FOLDER name="folder1_1" size="none" time="2010/05/12 19:19:55">
<FOLDER size="none" time="2009/05/12 19:20:36">folder1_1_1</FOLDER>
</FOLDER>
</FOLDER>
</FILE_LIST>

<FILE_LIST REQUESTPATH="\\su-san\app">

<FOLDER name="folder1" size="nonebyte" time="2010/05/12 19:13:32">

<FOLDER name="folder1_1" size="none" time="2010/05/12 19:19:55">
<FOLDER size="none" time="2009/05/12 19:20:36">folder1_1_1</FOLDER>
<FOLDER size="none" time="2009/05/12 19:19:54">folder1_1_2</FOLDER>
</FOLDER>

<FOLDER name="folder1_2" size="none" time="2010/05/12 16:19:49">
<FOLDER size="none" time="2009/05/12 16:19:49">folder1_2_1</FOLDER>
</FOLDER>
</FOLDER>

<FOLDER name="folder2" size="nonebyte" time="2010/05/12 19:13:32">

<FOLDER name="folder2_1" size="none" time="2010/05/12 19:19:55">
<FOLDER size="none" time="2009/05/12 19:20:36">folder2_1_1</FOLDER>
<FOLDER size="none" time="2009/05/12 19:19:54">folder2_1_2</FOLDER>
</FOLDER>

<FOLDER name="folder2_2" size="none" time="2010/05/12 16:19:49">
<FOLDER size="none" time="2009/05/12 16:19:49">folder2_2_1</FOLDER>
</FOLDER>
</FOLDER>
</FILE_LIST>
</LIST>

こういった階層構造になっている場合に、今は下記のようなソースで全ての
フォルダ名を取ってくるようになっております。
(自分で作ったソースから大分修正が・・・T_T)

public static final String TAG_FILELIST = "FILE_LIST";
public static final String TAG_FOLDER = "FOLDER";
public static final String TAG_FILE = "FILE";
public static final String REQUESTPATH = "REQUESTPATH";
public static final String NAME = "name";

private TreeMap<String, String> getFolderList(Node node, String parent, TreeMap<String, String> folderList)
{
if (folderList == null)
folderList = new TreeMap<String, String>();

if (TAG_FILELIST.equals(node.getNodeName())) {
NamedNodeMap attrs = node.getAttributes();
Node attr = attrs.getNamedItem(REQUESTPATH);
parent = attr.getNodeValue();
folderList.put(parent, parent);
} else if (TAG_FOLDER.equals(node.getNodeName())) {
NamedNodeMap attrs = node.getAttributes();
Node attr = attrs.getNamedItem(NAME);
Node test = attr.getLastChild();
if (attr != null)
{
parent += File.separator + attr.getNodeValue();
(Fileクラス:public static final String separator = "" + separatorChar;)
folderList.put(parent, parent);
}
}

if (node.hasChildNodes())
{
NodeList list = node.getChildNodes();
for (int i = 0;i < list.getLength(); i++)
{
Node childNode = list.item(i);
folderList = getFolderList(childNode, parent, folderList);
}
}

最初のnodeにはdoc.getFirstChild();した親ノードが入ってきます。

今現状の処理ですと、全てのノード名を取ってきてしまうのですが、
\\su-san\top
\\su-san\top\folder1
\\su-san\app\folder1
\\su-san\app\folder2
だけを取ってきたいと思っております。

全階層のノードを取得した後に最下層のノードだった場合は
はじく方法はあるのでしょうか?
(ノードを取得する際に最下層ノードだった場合は取得しない としたい)

ご教授頂ければ幸いです。
宜しくお願い致します。
業務でXML市場を調べることになりました。

XMLの仕様はWorld Wide Web Consortium (W3C) により策定・勧告されている
のですが、わたしが調べたところでは、1998年にXML1.0が勧告され、
2004年にXML1.1が勧告されたのみ。いまどきこんなに変わらないものが
あるとは。
 日本では流通BMSさんが流通EDI向けの業界標準XMLを管理していて、
公開情報からは非常に便利なものだと察せられます。また、米国ウォルマート
が競合他社との差別化にXMLを活用したなどの情報もネットでひっかかります。
という訳で、いろんな成功事例があっても良さそうな気がするのですが、意外と
公開されている情報は少なく、ミステリアスな印象。
 また、先日、XMLデータベース市場で有名なあるベンダーさんのセミナーに
参加させていただいたのですが、XML業界では著名な講師の方が、
『XMLデータベースは基幹業務システムには向いていません』という流れで
プレゼンをされていたので、頭が混乱してしまいました。
まあ、XMLとXMLデータべースとは、分けて考えるべきなのでしょう。
 XMLの利点のひとつに検索優位性があるのですが、流通業の場合、
日々のお買いものに紐づくデータを扱いますので、セールスプロモーションへの
XMLデータの利活用はやりやすそうな感じがしています。
 それにしても、何故、情報が少ないのか、判断できるだけの情報がありません。
皆様から、鋭い突っ込みを賜れれば幸いです。

http://ja.wikipedia.org/wiki/Extensible_Markup_Language

ログインすると、残り17件のコメントが見れるよ

mixiユーザー
ログインしてコメントしよう!

XML 更新情報

XMLのメンバーはこんなコミュニティにも参加しています

星印の数は、共通して参加しているメンバーが多いほど増えます。

人気コミュニティランキング