人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

xpath の記述方法について教えてください。

次のような xml ファイル (test.xml) があるとします。
<?xml version="1.0" encoding="UTF-8" ?>
<addressbook>
<address>1-2-3 <font color='#FF0000'>Tokyo</font>, JAPAN</address>
<phone>123456</phone>
<name>Taro Yamada</name>
</addressbook>

次のような PHP スクリプトを実行します。
<?php
$xml = simplexml_load_file ("test.xml");
$xpath = "/addressbook/address";
$data = $xml->xpath($xpath);
echo ($data[0]);
?>

echo で表示されるのは「1-2-3 , JAPAN」となります。
これを、「1-2-3 <font color='#FF0000'>Tokyo</font>, JAPAN」と表示するには xpath をどのように変更するべきか教えてください。

つまり、取得したい要素の下にさらに別の要素がある場合 (私の場合は html タグ) それらを通常のテキストとして扱う方法が知りたいということです。

よろしくお願いします。
ちなみに、取得した値は最終的にデータベースに格納します。

Apache 2.2.11
PHP 5.3.0
MySQL 5.1.36

●質問者: にぎたま
●カテゴリ:コンピュータ ウェブ制作
✍キーワード:1-2-3 Apache echo HTML JAPAN
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● ヨネちゃん
●20ポイント

XMLの属性値を取得することは出来るので、

「1-2-3 , JAPAN」と「<font color='#FF0000'>Tokyo</font>」を取得することは可能ですが、

<address>1-2-3 <font color='#FF0000'>Tokyo</font>, JAPAN</address>

の場合XMLとして構文が間違っていると思われるので、

「<font color='#FF0000'>Tokyo</font>」がどこに入っていたかを返す命令が無いようです。


例えばtest.xmlを、

<addressbook>

<address>1-2-3 &lt;font color='#FF0000'&gt;Tokyo&lt;/font&gt;, JAPAN</address>

<phone>123456</phone>

<name>Taro Yamada</name>

</addressbook>

とすることは出来ないのでしょうか?

◎質問者からの返答

ありがとうございます。

シンプルですが確実な方法ですね。

xml要素の種類は20もないので、それらを秀丸の前方不一致、後方不一致で排除すれば、< を &lt; に変えることは可能です。

レコード数は複数ファイルに別れていますが、合計で100万件以上で、1件のレコードには10?15個くらいのxml要素が含まれているという状況です。

定期的に発生する作業なので、(秀丸にマクロ登録したとしても) No2 の方の回答を応用して自動化した方がよさそうです。

回答いただきありがとうございました。Thank you anyway.


2 ● tobeoscontinue
●100ポイント ベストアンサー

取得したい要素をasXML()でもう一度、XMLに戻してみてはどうでしょう。

var_dump ($data[0]->asXML());
var_dump (str_replace(array('<address>','</address>'), NULL, $data[0]->asXML()));
var_dump (substr($data[0]->asXML(),9,-10));

ただXMLなのでaddressタグが付加されます。不必要なら正規表現などで取り除く必要があります。

addressタグが固定ならstr_replaceやsubstrで取り除くと多少エコかと。

◎質問者からの返答

ありがとうございます。

これで解決です。

上でも書きましたが、合計100万レコード以上あり、1レコードには15?20要素 (内容はすべて把握しています) が含まれています。html が含まれている可能性があるのはそのうちの 2 つなので、データベースに格納する前に asXML() 処理をして前後のタグをカットすれば完璧です。

便利な関数を教えていただきありがとうございます。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ