PHPでXMLを解析する

Daisukeh 2009/05/23 14:27 初稿
Daisukeh 2009/08/09 10:40 移設

記事一覧

XMLの解析

 PHP言語を使っているほとんどの人は、何らかの形でウェブ・プログラミングをしているのだと思う。PHPという言語そのものが、HTMLを内包したり、出力されるHTMLのコントロールができるという仕組みがあるから、それは容易に想像できる。あるいは、バックボーンになっている言語の柔軟さと広範囲をカバーするライブラリ群、PEARZendFrameworkなどの外部ライブラリやフレームワークを簡単に使えるという点も大きい。だから、直接にウェブページを生成しないプログラムであっても、PHPを使うことはとても便利だしスピーディ(アジャイル?)なのだ。たとえばこのトピックで紹介するXMLを解析する作業もそのひとつである。

 以下に示すコードは、 ある程度の汎用性を持たせた XMLの解析クラスである。PHPXMLを解析するにはいろいろな方法があると思う。たとえばPEARXML_Parserなどを使う方法もある。ここでは標準ライブラリにあるxml_parser_createで操作する一連の関数群を使うことにした。解析処理にはまず解析オブジェクトを生成(xml_parser_create)してから、クラスのインスタンスをその解析オブジェクトに割り当てる。(xml_set_object)これはコールバック関数内で、インスタンスのパラメータにアクセスするために、スコープの範囲を決定するために必要な操作だ。次に、タグ開始とタグ終了、タグ情報のそれぞれのコールバック関数を割り当てる。(xml_set_element_handlerxml_set_default_handler)これもインスタンスに対して割り当てる必要がある。( array(&$this, “parseStart”) などの表現)クラス定義は(御存知だと思うが)生成されるまで実体がないため、コールバック関数も存在しないことなるからだ。一通りのセットアップが終わったなら、XMLの解析を行う。(xml_parse)解析中にはそのタグ構造がコールバック関数を通して返される。最後に解析終了の処理をおこなう。(xml_parser_free

 自分が最初にXML解析をしようとして感じたことなのだが、PHPXMLを解析しようとしてつまずくのって、おそらくこういうコールバック関数があるようなデータ・ドリブンな処理なんだと思う。関数の使い方は簡単でも、返されるデータが入れ子になっていたり、識別子を自分で管理しなければいけなかたりすると、簡単なデータ構造やアルゴリズムを考えなければならない。このコードが ある程度の汎用性を持たせた XML解析クラスであるというのはそういうことなのである。使い方はまず $string にはソースとなるXMLUTF-8 エンコードのもの)を、そして $block に解析したい単位のタグ名を指定する。 $link$block で指定した外側(=親)のデータを引き継ぐかどうかのフラグを指定するものだ。だから普通に使うのであれば $string$block を指定すればよい。文字コードはxml_parser_createのデフォルトが UTF-8 なので、使う環境に合わせて引数を追加したりするなどすればよいと思う。

class XMLParser

// XMLParser : XML解析クラス
class XMLParser
{
    private $xml_parser;                // XML解析オブジェクト
    private $xml_block;                 // ブロックタグ
    private $xml_link;                  // リンクフラグ
    private $xml_array;                 // 解析結果
    private $xml_current;               // カレントノード
    private $xml_element;               // カレント要素
 
    // XMLParser::parse : XML解析
    public function parse($string = null, $block = null, $link = false)
    {
        $this->xml_array   = array();
        if(($string == null) || ($block == null)) return null;
        $this->xml_block   = strtolower(trim($block));
        $this->xml_link    = ($link == true) ? array() : null;
        $this->xml_parser  = xml_parser_create("UTF-8");
        $this->xml_current = null;
        $this->xml_element = null;
        xml_set_object($this->xml_parser, $this);
        xml_set_element_handler($this->xml_parser,
                                array(&$this, "parseStart"),
                                array(&$this, "parseEnd"));
        xml_set_default_handler($this->xml_parser,
                                array(&$this, "parseDefault"));
        xml_parse($this->xml_parser, $string);
        xml_parser_free($this->xml_parser);
        return $this->xml_array;
    }
 
    // XMLParser::parseStart : タグ開始コールバック
    private function parseStart($parser, $name, $attribs)
    {
        $name = strtolower(trim($name));
        $this->xml_element = $name;
        if($name == $this->xml_block)
        {
            $this->xml_current = array();
            $this->xml_element = null;
        }
    }
 
    // XMLParser::parseDefault : タグ情報コールバック
    private function parseDefault($parser, $data)
    {
        $data = trim($data);
        if($this->xml_element == null) return;
        if(is_array($this->xml_current))
        {
            if(array_key_exists($this->xml_element, $this->xml_current))
                $data = $this->xml_current[$this->xml_element]." ".$data;
            $this->xml_current[$this->xml_element] = $data;
        }
        else if(is_array($this->xml_link) && ($data != null))
        {
            $this->xml_link   [$this->xml_element] = $data;
        }
        $this->xml_element = null;
    }
 
    // XMLParser::parseEnd : タグ終了コールバック
    private function parseEnd($parser, $name)
    {
        $name = strtolower(trim($name));
        if($name == $this->xml_block)
        {
            if(is_array($this->xml_current))
            {
                if(is_array($this->xml_link))
                    foreach($this->xml_link as $key => $value)
                        $this->xml_current[$key] = $value;
                $this->xml_array[] = $this->xml_current;
                $this->xml_current = null;
            }
        }
    }
}

 どうだろうか?短いしギミックも何もないシンプルなコードなのでわかりやすいと思う。つまりは、 parseStart で開始タグを判定・記憶しておいてから、 parseDefault でそのデータを取得・保存する。XMLはその仕様から入れ子式になっているから、必ず対応する終了タグが parseEnd で捕捉されることになる。そこで終了タグの判定をして、ひとつのノード分のデータが抽出されたかを確認する、といった具合である。ちょっとしたことだけど、意外と面倒くさいことはたしかだ。

Yahoo!のウェブ・サービス

 せっかくXMLの解析ができるようになったので、Yahoo!ディベロッパーネットワークが提供しているニューステキスト解析のウェブ・サービスを使って、ニュース解析をしてみる。1)これらのサービスはYahooが無料で提供しているもので、ニュース情報はYahooのニューストピックと同じ(あるいはそれ以上の)情報を入手することができるものだ。また、テキスト解析は形態素や係り受けなどの各種日本語テキスト解析ができるもので、登録されている形態素が豊富で、ニュースに記載される一般的な固有名詞なら十分に解析が可能である。係り受けについても、ある程度なら複数の文があっても解析できるようであった。テキスト解析についてはJUMANKNPなどが手軽に使えるオフラインツールとして有名である。自分も一時期使っていた。オフラインとオンラインの違いは形態素の精密さだと思う。オフラインの場合どうしても時事的な単語が解析しにくいが、オンラインであればサービスサイドで辞書の強化学習をすればよいため、非常に使い勝手がよい。

 下に示すコードはYahoo!ディベロッパーネットワークからニュースを取得して各種の情報を抽出してから、タイトルや要約などをテキスト解析した結果をデータベースに保存するサンプルである。データベース操作にはPEARDBというパッケージをつかっている。これは接続先を抽象化できるもので、接続文字列にデータベースエンジンやログイン文字列を指定してコネクションができたら、その後のクエリ操作は接続先を意識しなくてもよいというものだ。(ちなみにこのコードはこのままコピー&ペーストしても動作しない。2)

Yahoo!ニュース&テキスト解析

// 初期化
require_once("DB.php");
$taglist = array(               // 日本語変換タグ
    "title",                    // タイトル
    "topicname",                // トピック
    "category",                 // 主分類
    "subcategory",              // 副分類
    "keyword",                  // キーワード
);
 
// データベース接続
$db =& DB::connect("mysqli://root:@localhost/web");
if(PEAR::isError($db)) return;
 
// ニュース解析
$parser = new XMLParser();
foreach($categories as $category)
{
    // ニュース抽出
    $request = "http://news.yahooapis.jp/NewsWebService/V1/Topics?appid={$appid}"
             . "&sort=datetime&num={$num}&category={$category}";
    $newsxml = file_get_contents($request);
    foreach($taglist as $tag)
    {
        // 日本語化
        if(!preg_match_all("/<{$tag}>([^\\n]+)<\\/{$tag}>/i", $newsxml, $mch)) continue;
        foreach($mch[1] as $index => $value)
        {
            $value   = "<{$tag}>".japanize($value)."</{$tag}>";
            $newsxml = str_replace($mch[0][$index], $value, $newsxml);
        }
    }
 
    // ニュース解析
    $newsfeed = $parser->parse($newsxml, "result");
    foreach($newsfeed as $news)
    {
        // ニュース抽出
        $news["datetime"] = ($datetime = date("Y-m-d H:i:s", strtotime($news["datetime"])));
        $htmlsrc  = mb_convert_encoding(file_get_contents($news["url"]), "UTF-8", "EUC-JP");
        $headline = preg_replace("/[\r\n]/", "", $htmlsrc);
        $article  = null;
        $linkurl  = null;
        $imageurl = null;
        $summary  = null;
        if(preg_match("/<div id=\"detailheadline\">(.+)<\/div><!\-+\/detailHeadline/i", $headline, $mch))
        {
            $headline = $mch[1];
            if(preg_match("/class=\"image\">.+<img src=\"([^\"]+)\"/i", $headline, $mch))
                $imageurl = $mch[1];
            if(preg_match("/<h3><a href=\"([^\"]+)\">(.+)<\/a><\/h3>/i", $headline, $mch))
            {
                $linkurl  = $mch[1];
                $article  = $mch[2];
            }
            else if(preg_match("/<div id=\"detailbacknumber\">.*<a href=\"([^\"]+)\">(.+)<\/a>/i", $headline, $mch))
            {
                $linkurl  = $mch[1];
                $article  = $mch[2];
            }
            if(preg_match("/<\/h3>(.+)<br><a href/i", $headline, $mch))
                $summary  = $mch[1];
            $article = japanize($article);
            $summary = japanize($summary);
        }
        if($summary == null)
            if(preg_match('/<div id="detailsummary">[\r\n]*<p>(.+)<a.+\/a><\/p>[\r\n]*<\/div>/i', $htmlsrc, $mch))
                $summary = japanize($mch[1]);
        if(($title = $news["title"]) == "") $title = $article;
        else if($news["topflg"] == "0") $news["topflg"] = "1";
 
        // ログ判定
        $res =& $db->execute($db->prepare(
            "select categoryid from news_category where category=_utf8?"),
            array($news["category"]));
        if($res->numRows() > 0)
        {
            $res->fetchInto($row);
            $res =& $db->execute($db->prepare(
                "select logid, datetime from news_log where (title=_utf8?) and (categoryid=?)"),
                array($title, $row[0]));
            if($res->numRows() > 0)
            {
                $res->fetchInto($row);
                if(substr($datetime, 0, 16) == substr($row[1], 0, 16)) continue;
                if(substr($datetime, 0, 10) == substr($row[1], 0, 10))
                    $db->execute($db->prepare(
                        "delete from news_log where logid=?"),
                        array($row[0]));
            }
        }
 
        // 係り受け解析1
        $ttlmorph = array();
        $request  = "http://jlp.yahooapis.jp/DAService/V1/parse?appid={$appid}"
                  . "&sentence=".urlencode($title);
        $morphlst = $parser->parse(file_get_contents($request), "morphem", true);
        foreach($morphlst as $word)
        {
            // 形態素抽出
            $features = split(",", $word["feature"]);
            $pos =  $word["pos"];
            if(($subpos = trim($features[1])) != "") $pos .= ":".$subpos;
            $sql =  $db->prepare("select id from spch_part where name=_utf8?");
            $res =& $db->execute($sql, array($pos));
            if($res->numRows() == 0)
            {
                $db->execute($db->prepare(
                    "insert ignore into spch_part (name) values (_utf8?)"),
                    array($pos));
                $res =& $db->execute($sql, array($pos));
            }
            $res->fetchInto($row);
            $posid = $row[0];
            $ttlmorph[] = array(
                intval($word["id"]),
                intval($word["dependency"]),
                urlencode($word["surface"]),
                urlencode($word["reading"]),
                intval($posid),
            );
        }
        $ttlmorph = serialize($ttlmorph);
 
        // 係り受け解析2
        $morphlst = array();
        if($summary != null)
        {
            $request = "http://jlp.yahooapis.jp/DAService/V1/parse?appid={$appid}"
                 . "&sentence=".urlencode($summary);
            $morphlst = $parser->parse(file_get_contents($request), "morphem", true);
        }
        $summorph = array();
        foreach($morphlst as $word)
        {
            // 形態素抽出
            // ※係り受け解析1と同様なので省略
        }
        $summorph = serialize($summorph);
 
        // ログ登録
        $topicid       = updateDB($db, "topic",    $news["topicname"],   $datetime);
        $categoryid    = updateDB($db, "category", $news["category"],    $datetime);
        $subcategoryid = updateDB($db, "category", $news["subcategory"], $datetime);
        if(array_key_exists("keyword", $news))
        {
            $keywords  = split(" ", $news["keyword"]);
            $keywordid = "";
            foreach($keywords as $keyword)
                if(($id = updateDB($db, "keyword", $keyword, $datetime)) > 0)
                    $keywordid .= "|{$id}";
            $keywordid = ($keywordid == "") ? null : ($keywordid."|");
        }
        else $keywordid = null;
        if(($rating = floatval($news["pvindex"])) == 0.0)
            if($news["topflg"] == "1") $rating = 0.1;
        $db->execute($db->prepare(
            "insert ignore into news_log ".
            "(datetime, title, topicid, categoryid, subcategoryid, keywordid, rating, url,".
            " linkurl, imageurl, article, summary, ttlmorph, summorph) ".
            "values (?, _utf8?, ?, ?, ?, ?, ?, ?, ?, ?, _utf8?, _utf8?, _utf8?, _utf8?)"),
            array($datetime, $title, $topicid, $categoryid, $subcategoryid, $keywordid, $rating, $news["url"],
                  $linkurl, $imageurl, $article, $summary, $ttlmorph, $summorph));
    }
}
 
// データベース切断
$datetime = date("Y-m-d H:i:s", strtotime("now -1 year"));
$db->execute($db->prepare(
    "delete from news_log where datetime<=?"),
    array($datetime));
$db->disconnect();
 
// japanize : 日本語変換
function japanize($text)
{
    return trim(mb_convert_kana(htmlspecialchars_decode(strip_tags($text)), "RNAsKV", "UTF-8"));
}
 
// updateDB : データベース更新
function updateDB($db, $name, $value, $datetime)
{
    if(strlen($value) <= 2) return -1;
    $value = trim($value);
    $sql =  $db->prepare("select {$name}id from news_{$name} where {$name}=_utf8?");
    $res =& $db->execute($sql, array($value));
    if($res->numRows() == 0)
    {
        $db->execute($db->prepare(
            "insert ignore into news_{$name} ({$name}) values (_utf8?)"),
            array($value));
        $res =& $db->execute($sql, array($value));
    }
    $res->fetchInto($row);
    $id = $row[0];
    $db->execute($db->prepare(
        "update news_{$name} set datetime=? where {$name}id=?"),
        array($datetime, $id));
 
    return $id;
}

 このコードではカテゴリ毎のニュース解析に1回、ニュース毎のテキスト解析に2回のXML解析をしている。ニュースは全件抽出をしているため、3割くらいのニュースにタイトルが付いていないことがあるため、要約を取得する処理でタイトルの再抽出もしている。タイトルと要約はテキスト解析によって、係り受けと形態素情報に分離してからシリアライズしている。最終的にそれらのデータをPEARDBオブジェクトを使ってMySQLのテーブルに追加している。ここで押えておきたいポイントが2個ある。1個目は抽出した日本語のクリーニングである。空白や記号、HTMLエンティティやタグなどを除去あるいは置換して、 “きれいな” 日本語テキストにしなければならない。これはテキスト解析する際にも有効なことだし、シリアライズした形態素の分類などにおいても、すこし書き方が違うだけで同じキーワードだという状況を回避できる可能性があるからだ。これを行っているのが japanize という関数で、 trim(mb_convert_kana(htmlspecialchars_decode(strip_tags($text)), “RNAsKV”, “UTF-8”)); という関数群がその処理に対応している。2個目はデータベースの UTF-8 の使い方である。これはMySQLに限定されたことなのだが、クエリに UTF-8 文字コードを含んでいる場合で基本文字コードが UTF-8 でなく SJIS などの場合に、 _utf8”文字列” と書くことで正しく指定できるのだ。最初これがわからなくて、COLLATIONが違うとかCHARSETが違うとかのエラーが出て焦った。よく調べてみるとシステムの文字コードと違う場合や正確にクエリを構成させるために、 _utf8 指定文字列というキーワードが用意されているようだった。上記のコードはすべての文字列が UTF-8 で扱われているため、その指定が必要だったようだ。もちろんテーブルのCHARSETが UTF-8 であることは言うまでもない。

 こういったウェブ・サービスを利用したプログラムは、いかにもPHPらしいと思う。これでフロントエンドのウェブ・ページをレンダリングするコードを用意すれば、ニュースサイト(斜め読み的な)の出来上がりである。あるいは形態素を利用したマインドマップのようなものや、キーワードを時系列にならべたり、とアイディアは尽きない。今考えているのはパーセプトロンアソシアトロンのようなものができないか、というアイディアだ。これはコンピュータにとって文字列は数列あるいはそのアドレスであって、いずれも数値であることには変わりない。それらを並べて関連性をニューラルネットワークで表現したとき、そのブラックボックスに入力する情報と出力される情報がどのようなものになるか、というものだ。ニュースなどの一般性のある情報から構築されたネットワークが生み出す ”集合知” とはいったい何なのか、とても興味がある。あるいはRIAによる情報の可視化(ビジュアリゼーション)である。FlexProcessingによって、テキストのデータをグラフィックのデータへ転置した時、そこに何が見えてくるかということだ。どちらにしてもテキスト・マイニングやセマンティック・ウェブに近いことで、近年盛んに研究されている。こういうことが少しずつ既存技術になって、普通のプログラマが手軽に実験できるというのは素晴らしいものだ。

1) というより、それが目的でXML解析エンジンを作った。
2) Yahoo!ディベロッパーネットワークのアカウント取得や、データベースの管理が必要。

掲示板

, 2013/01/22 10:28
NfpHhe <a href=http://cheapwigjp.com/>メンズウィッグ 通販</a> taoxkl http://cheapwigjp.com/ FruWwd <a href=http://porterjapan.com/>ポーター コインケース</a> vtqgsv http://porterjapan.com/ KxuNsw <a href=http://coachbagonsalejp.com/>楽天 コーチ 財布</a> drjxih http://coachbagonsalejp.com/ UfhGom <a href=http://lvforsalejp.com/>ルイヴィトン 財布</a> ggruvy http://lvforsalejp.com/ IqbSaa <a href=http://cheapchaneloutletjapan.com/>シャネル 財布 チェーン</a> sfzcef http://cheapchaneloutletjapan.com/ OunVmy <a href=http://jestinabagjapan.com/>少女時代 バッグ</a> zntuod http://jestinabagjapan.com/ XuzIjx <a href=http://monsterbeatsshopjp.com/>monster イヤフォン</a> ajxozi http://monsterbeatsshopjp.com/ ErtKyu <a href=http://cheapjpprada.com/>プラダ キーケース 定価</a> xsowgv http://cheapjpprada.com/
, 2013/01/24 11:05
LgqMqk <a href=http://cheapwigjp.com/>かつら 販売</a> aczkxq http://cheapwigjp.com/ WqsAlj <a href=http://porterjapan.com/>吉田カバンポーター</a> vbcsuj http://porterjapan.com/ HqbJgh <a href=http://coachbagonsalejp.com/>コーチ バッグ 人気</a> khplle http://coachbagonsalejp.com/ EjgChs <a href=http://lvforsalejp.com/>ヴィトン 財布 ヴェルニ</a> gbscqd http://lvforsalejp.com/ XwuAcv <a href=http://cheapchaneloutletjapan.com/>シャネル 店舗 化粧品</a> ezgpju http://cheapchaneloutletjapan.com/ QyqFvf <a href=http://jestinabagjapan.com/>j.estina 通販</a> ykrrqb http://jestinabagjapan.com/ DtiJkg <a href=http://cheapjpprada.com/>プラダ 店舗 大阪</a> ttdcof http://cheapjpprada.com/ TgnEfm <a href=http://jpguccibagsale.com/>グッチ 財布 メンズ 長財布</a> zagdqa http://jpguccibagsale.com/
, 2013/01/24 15:23
LrgPfq <a href=http://jestinasalejp.com/>J.estinaリュック</a> luzxfc http://jestinasalejp.com/ OcsIql <a href=http://salewigjp.com/>激安ウィッグ</a> hapngm http://salewigjp.com/ WngZpg <a href=http://cheapcoachbagjp.com/>楽天 コーチ 財布</a> qqegoi http://cheapcoachbagjp.com/ FehHrj <a href=http://guccisalejapan.com/>グッチ バッグ 人気</a> ozzeyt http://guccisalejapan.com/ EcaFca <a href=http://cheappradabagsalejp.com/>プラダ アウトレット 価格</a> xbqflh http://cheappradabagsalejp.com/ LhtAfc <a href=http://cheapguccibagsalejp.com/>グッチ 財布 メンズ 長財布</a> IfvIxc <a href=http://chromeheartsforjp.com/>クロムハーツ ジッポ</a> qasueo http://chromeheartsforjp.com/ SieXxx <a href=http://guccijpforsale.com/>グッチ アウトレット バッグ</a> exxdpi http://guccijpforsale.com/
, 2013/01/24 15:26
YupRxr <a href=http://monsterbeatsforjp.com/>モンスタービーツ イヤホン</a> rzkjjn http://monsterbeatsforjp.com/ MbmJlp <a href=http://mbtforsalejp.com/>mbtシューズ 通販</a> wnjdaf http://mbtforsalejp.com/ TdvVpb <a href=http://gorossalejp.com/>ゴローズ イーグル ベルト</a> ehvbew http://gorossalejp.com/ DvcBis <a href=http://louisvuittonjpcheap.com/>ヴィトン 財布 ランキング</a> jadwkm http://louisvuittonjpcheap.com/ NgwChj <a href=http://chromeheartsforjp.com/>モンスタービーツ</a> ipqxjn http://chromeheartsforjp.com/ PfiNjr <a href=http://adidassoccershoesjp.com/>adidas シューズ</a> ekpcmf http://adidassoccershoesjp.com/ CgaFja <a href=http://lovesoccershoesjp.com/>激安サッカーシューズ</a> swwxhi http://lovesoccershoesjp.com/ RadSda <a href=http://nikesoccershoesjp.com/>サッカースパイク通販</a> zdmwoe http://nikesoccershoesjp.com/
, 2013/01/24 15:27
LczLwa <a href=http://mcmbagoutletjp.com/>MCM 店舗 大阪</a> ldlues http://mcmbagoutletjp.com/ QrmUrl <a href=http://pradaforcheapjp.com/>プラダ バッグ</a> izxivw http://pradaforcheapjp.com/ NoaAmo <a href=http://jplouisvuittoncheap.com/>ルイヴィトン バッグ</a> nnxfsc http://jplouisvuittoncheap.com/ LmmFan <a href=http://jestinabaginjp.com/>J.estinaハンドバッグ</a> thzmdx http://jestinabaginjp.com/ NauZcu <a href=http://coachbagforsalejp.com/>コーチ 財布 人気</a> byhtxr http://coachbagforsalejp.com/ KdgVdr <a href=http://cheapmcmbagsalejp.com/>MCM リュック 白</a> oeubiz http://cheapmcmbagsalejp.com/ WmgVvp <a href=http://jppradacheap.com/>プラダ トート ピンク</a> ekbinz http://jppradacheap.com/ JqhAwy <a href=http://pradahandbagsalejp.com/>プラダ ポーチ コピー</a> iszxvn http://pradahandbagsalejp.com/
, 2013/01/24 15:27
RbpAtx <a href=http://jpmcmsale.com/>MCM リュック 白</a> lngkhu http://jpmcmsale.com/ PkzXzh <a href=http://jpmcmbagsale.com/>MCM 韓国</a> seznxc http://jpmcmbagsale.com/ FqcFhp <a href=http://chromeheartsforjp.com/>クロムハーツ公式サイト</a> vbhjui http://chromeheartsforjp.com/ JpxHzh <a href=http://chromeheartsinjp.com/>クロムハーツ 直営店</a> goyswi http://chromeheartsinjp.com/ QfjSlw <a href=http://cheapjpgucci.com/>グッチ キーケース</a> cpwmva http://cheapjpgucci.com/ ZdjTmz <a href=http://jestinabagsjp.com/>j.estina 財布</a> qxzsqy http://jestinabagsjp.com/ LwdEsv <a href=http://guccihandbagsalejp.com/>グッチ 財布 新作</a> rtnbta http://guccihandbagsalejp.com/ LfuWcs <a href=http://jestinabagscheapjp.com/>j.estina 財布</a> ssyazl http://jestinabagscheapjp.com/
, 2013/01/24 15:33
WvdAbm <a href=http://jestinasalejp.com/>J.estinaリュック</a> ouxxgm http://jestinasalejp.com/ ZeuFiy <a href=http://salewigjp.com/>メンズ かつら</a> whjfag http://salewigjp.com/ JumMos <a href=http://cheapcoachbagjp.com/>コーチ バッグ メンズ</a> nlvyhs http://cheapcoachbagjp.com/ UztGpa <a href=http://guccisalejapan.com/>グッチ キーケース 一覧</a> tzrfss http://guccisalejapan.com/ QvbShl <a href=http://cheappradabagsalejp.com/>プラダ キーケース 新作</a> vqbshk http://cheappradabagsalejp.com/ UzrAvd <a href=http://cheapguccibagsalejp.com/>グッチ バッグ ショルダー</a> WuoVyu <a href=http://chromeheartsforjp.com/>クロムハーツ スペーサーリング</a> zgbijw http://chromeheartsforjp.com/ FhuZmh <a href=http://guccijpforsale.com/>グッチ キーケース 値段</a> segfet http://guccijpforsale.com/
, 2013/01/24 15:37
PfnYvq <a href=http://mcmbagoutletjp.com/>MCM 店舗 名古屋</a> ozvkil http://mcmbagoutletjp.com/ GwtAqb <a href=http://pradaforcheapjp.com/>プラダ バッグ デニム</a> jbnzcb http://pradaforcheapjp.com/ FbiIzm <a href=http://jplouisvuittoncheap.com/>ルイヴィトン 財布</a> xdkwkd http://jplouisvuittoncheap.com/ LsgYuu <a href=http://jestinabaginjp.com/>j.estina 財布</a> wynvtz http://jestinabaginjp.com/ KdfJic <a href=http://coachbagforsalejp.com/>コーチ バッグ レガシー</a> wmivtl http://coachbagforsalejp.com/ RnyHwj <a href=http://cheapmcmbagsalejp.com/>MCM バッグ 通販</a> jlogas http://cheapmcmbagsalejp.com/ ObeIrt <a href=http://jppradacheap.com/>プラダ ポーチ デニム</a> oocakn http://jppradacheap.com/ MteFki <a href=http://pradahandbagsalejp.com/>プラダ 店舗</a> kgeejm http://pradahandbagsalejp.com/
, 2013/01/24 15:37
SsnBaz <a href=http://monsterbeatsforjp.com/>モンスター イヤホン 激安</a> ppdrdu http://monsterbeatsforjp.com/ KdxAei <a href=http://mbtforsalejp.com/>mbtシューズ 販売店</a> cgrjxo http://mbtforsalejp.com/ MmnUdy <a href=http://gorossalejp.com/>ゴローズ通販</a> vtiaes http://gorossalejp.com/ SckGfv <a href=http://louisvuittonjpcheap.com/>ルイヴィトン 財布 新作 2012</a> xyzstl http://louisvuittonjpcheap.com/ DcfDhc <a href=http://chromeheartsforjp.com/>beats by dr.dre ヘッドフォン</a> coryae http://chromeheartsforjp.com/ DbwNck <a href=http://adidassoccershoesjp.com/>サッカースパイク通販</a> prgodp http://adidassoccershoesjp.com/ KttJqa <a href=http://lovesoccershoesjp.com/>プーマ スパイク</a> yyxcsj http://lovesoccershoesjp.com/ OhxNxe <a href=http://nikesoccershoesjp.com/>サッカースパイクt90</a> nhnbla http://nikesoccershoesjp.com/
, 2013/01/24 15:37
KmmEaf <a href=http://jpmcmsale.com/>MCM 韓国 免税店</a> tawrwe http://jpmcmsale.com/ DpjRzj <a href=http://jpmcmbagsale.com/>MCM リュック コピー</a> nnjnhe http://jpmcmbagsale.com/ JgsAal <a href=http://chromeheartsforjp.com/>クロムハーツ</a> cnflxn http://chromeheartsforjp.com/ DwvXbu <a href=http://chromeheartsinjp.com/>クロムハーツ マネークリップ</a> gtaxuo http://chromeheartsinjp.com/ RgqPlh <a href=http://cheapjpgucci.com/>グッチ アウトレット 大阪</a> jcejau http://cheapjpgucci.com/ ZqsBdn <a href=http://jestinabagsjp.com/>j.estina バッグ</a> himeox http://jestinabagsjp.com/ OlrQjv <a href=http://guccihandbagsalejp.com/>グッチ 長財布 ハート</a> dqznyh http://guccihandbagsalejp.com/ WptZse <a href=http://jestinabagscheapjp.com/>j.estina ピアス</a> yibxac http://jestinabagscheapjp.com/
, 2013/01/24 16:06
OizZky <a href=http://cheapwigjp.com/>ウィッグ 通販</a> mqjcsd http://cheapwigjp.com/ KwtGex <a href=http://porterjapan.com/>ポーター シャイン</a> osmpbl http://porterjapan.com/ SgxOwo <a href=http://coachbagonsalejp.com/>コーチ アウトレット ファクトリー</a> xlirjm http://coachbagonsalejp.com/ DsuOuz <a href=http://lvforsalejp.com/>ルイヴィトン 財布 エピ</a> nhlhkz http://lvforsalejp.com/ ButVdb <a href=http://cheapchaneloutletjapan.com/>シャネル 店舗 大阪</a> dkzmyr http://cheapchaneloutletjapan.com/ YbhOxa <a href=http://jestinabagjapan.com/>J.estina長財布</a> wkhlfu http://jestinabagjapan.com/ HdkLyu <a href=http://cheapjpprada.com/>プラダ バッグ 新作</a> oxbsfr http://cheapjpprada.com/ UrzGql <a href=http://jpguccibagsale.com/>グッチ アウトレット ベルト</a> npbokx http://jpguccibagsale.com/
, 2013/01/24 18:12
YfyBya <a href=http://cheapwigjp.com/>ウィッグ 人毛</a> elfrwz http://cheapwigjp.com/ KtcNtb <a href=http://porterjapan.com/>吉田カバン porter</a> lmeqpa http://porterjapan.com/ EjuAtc <a href=http://coachbagonsalejp.com/>コーチファクトリー セール</a> zmcuaq http://coachbagonsalejp.com/ TkyZvy <a href=http://lvforsalejp.com/>ルイヴィトン マフラー</a> ecyymk http://lvforsalejp.com/ ItjNwf <a href=http://cheapchaneloutletjapan.com/>シャネル 化粧品</a> kzdacr http://cheapchaneloutletjapan.com/ BatZpl <a href=http://jestinabagjapan.com/>j.estina バッグ</a> vwiqzh http://jestinabagjapan.com/ VobUgr <a href=http://cheapjpprada.com/>プラダ キーケース 新作</a> fxrdfi http://cheapjpprada.com/ NnwKpn <a href=http://jpguccibagsale.com/>グッチ キーケース ピンク</a> asbjcr http://jpguccibagsale.com/
, 2013/01/24 18:21
EdkHsn <a href=http://cheapwigjp.com/>ウィッグ 男性</a> tdmrnu http://cheapwigjp.com/ MeoTph <a href=http://porterjapan.com/>ポーター ウォレット</a> paijms http://porterjapan.com/ HrtHup <a href=http://coachbagonsalejp.com/>コーチ バッグ アウトレット メンズ</a> ntsykk http://coachbagonsalejp.com/ SurRts <a href=http://lvforsalejp.com/>ルイヴィトン バッグ エピ</a> iulmks http://lvforsalejp.com/ FdaGhs <a href=http://cheapchaneloutletjapan.com/>シャネル 財布 メンズ</a> mwqwfs http://cheapchaneloutletjapan.com/ FnkGyc <a href=http://jestinabagjapan.com/>J.estinaハンドバッグ</a> odnqbf http://jestinabagjapan.com/ LtiFik <a href=http://cheapjpprada.com/>プラダ 靴</a> wfgouk http://cheapjpprada.com/ AvsEmv <a href=http://jpguccibagsale.com/>グッチ バッグ バンブー</a> pqonus http://jpguccibagsale.com/
, 2013/01/25 16:59
YoeNai <a href=http://jestinasalejp.com/>j.estina 通販</a> mqsspc http://jestinasalejp.com/ OsiYqw <a href=http://salewigjp.com/>かつら 女性</a> pgujhg http://salewigjp.com/ BooJlt <a href=http://cheapcoachbagjp.com/>コーチ公式ファクトリーオンラインストア</a> uwrhev http://cheapcoachbagjp.com/ XedEuh <a href=http://guccisalejapan.com/>グッチ アウトレット 御殿場</a> jeuhdb http://guccisalejapan.com/ MttHji <a href=http://cheappradabagsalejp.com/>プラダ トート キャンバス</a> ofxyrr http://cheappradabagsalejp.com/ NqtPgm <a href=http://cheapguccibagsalejp.com/>グッチ バッグ 中古</a> GwwStl <a href=http://chromeheartsforjp.com/>クロムハーツ 価格</a> wxvpgd http://chromeheartsforjp.com/ ZrwInu <a href=http://guccijpforsale.com/>グッチ 長財布 アウトレット</a> xcjwxb http://guccijpforsale.com/
, 2013/01/25 16:59
DczGob <a href=http://monsterbeatsforjp.com/>モンスター ヘッドホン ワイヤレス</a> qtgjlz http://monsterbeatsforjp.com/ OjwRcz <a href=http://mbtforsalejp.com/>mbtシューズ 販売店</a> seousn http://mbtforsalejp.com/ HhjOuy <a href=http://gorossalejp.com/>ゴローズ通販</a> lgdmlz http://gorossalejp.com/ UoaWes <a href=http://louisvuittonjpcheap.com/>ルイヴィトン 財布 エピ</a> zblufr http://louisvuittonjpcheap.com/ VstKhb <a href=http://chromeheartsforjp.com/>モンスタービート</a> taaxjq http://chromeheartsforjp.com/ ZwjBry <a href=http://adidassoccershoesjp.com/>サッカーシューズ 通販</a> pkwvph http://adidassoccershoesjp.com/ ZggPbi <a href=http://lovesoccershoesjp.com/>サッカー 通販</a> cejrwf http://lovesoccershoesjp.com/ IxzMnd <a href=http://nikesoccershoesjp.com/>サッカースパイクt90</a> dmiafo http://nikesoccershoesjp.com/
, 2013/01/25 17:00
RrhYhg <a href=http://jpmcmsale.com/>MCM キーケース</a> ucofbe http://jpmcmsale.com/ LrjZmb <a href=http://jpmcmbagsale.com/>MCM リュック</a> ccelfb http://jpmcmbagsale.com/ CoaYbp <a href=http://chromeheartsforjp.com/>クロムハーツ ウエストバッグ</a> ygicfd http://chromeheartsforjp.com/ VfvYry <a href=http://chromeheartsinjp.com/>クロムハーツ 価格</a> whixfn http://chromeheartsinjp.com/ UwiByj <a href=http://cheapjpgucci.com/>グッチ 財布 レディース</a> bvmzgs http://cheapjpgucci.com/ OtbKdt <a href=http://jestinabagsjp.com/>j.estina ネックレス</a> cardpr http://jestinabagsjp.com/ QijMzu <a href=http://guccihandbagsalejp.com/>グッチ バッグ SOHO</a> ierngp http://guccihandbagsalejp.com/ XrlDdk <a href=http://jestinabagscheapjp.com/>j.estina 少女時代</a> iwbcau http://jestinabagscheapjp.com/
, 2013/01/25 17:08
GvcTix <a href=http://jestinasalejp.com/>j.estina 財布</a> atmqtu http://jestinasalejp.com/ CquHix <a href=http://salewigjp.com/>フルウィッグ</a> acmgnz http://salewigjp.com/ RwzLup <a href=http://cheapcoachbagjp.com/>コーチファクトリー DM</a> bhzypd http://cheapcoachbagjp.com/ WfhOlw <a href=http://guccisalejapan.com/>グッチ キーケース ハート</a> uottlt http://guccisalejapan.com/ KcnFzl <a href=http://cheappradabagsalejp.com/>プラダ バッグ</a> ioazvi http://cheappradabagsalejp.com/ MdbRgf <a href=http://cheapguccibagsalejp.com/>グッチ 長財布</a> GevMgf <a href=http://chromeheartsforjp.com/>クロムハーツ キーパーリング</a> xjshcz http://chromeheartsforjp.com/ LnfVyf <a href=http://guccijpforsale.com/>グッチ 時計</a> yxcnnt http://guccijpforsale.com/
, 2013/01/25 17:09
OimSfr <a href=http://monsterbeatsforjp.com/>beats by dr.dre イヤホン</a> xofwxh http://monsterbeatsforjp.com/ OysSzo <a href=http://mbtforsalejp.com/>mbt ダイエット</a> yijksa http://mbtforsalejp.com/ IgmQhv <a href=http://gorossalejp.com/>ゴローズ 財布 定価</a> cyrqwh http://gorossalejp.com/ LlfIro <a href=http://louisvuittonjpcheap.com/>ルイヴィトン バッグ ダミエ</a> qwjjsm http://louisvuittonjpcheap.com/ YvfAct <a href=http://chromeheartsforjp.com/>beats ヘッドフォン</a> vkfwko http://chromeheartsforjp.com/ FnhOgi <a href=http://adidassoccershoesjp.com/>サッカーショップ</a> nztkmn http://adidassoccershoesjp.com/ ArgBcn <a href=http://lovesoccershoesjp.com/>Nike サッカースパイク</a> auhggx http://lovesoccershoesjp.com/ LtfYmx <a href=http://nikesoccershoesjp.com/>サッカーのスパイク</a> raivgg http://nikesoccershoesjp.com/
, 2013/01/25 17:09
IjoNeh <a href=http://jpmcmsale.com/>MCM 財布 スタッズ</a> ufiort http://jpmcmsale.com/ OgaZio <a href=http://jpmcmbagsale.com/>MCM 店舗 韓国</a> gciwxz http://jpmcmbagsale.com/ QwgCfo <a href=http://chromeheartsforjp.com/>クロムハーツ リング</a> ipinsa http://chromeheartsforjp.com/ QglGsp <a href=http://chromeheartsinjp.com/>クロムハーツ 店舗</a> guyvpa http://chromeheartsinjp.com/ KhpAau <a href=http://cheapjpgucci.com/>グッチ キーケース 人気</a> fwrccr http://cheapjpgucci.com/ NfsVwq <a href=http://jestinabagsjp.com/>j.estina 財布</a> vvjmro http://jestinabagsjp.com/ IkpEeb <a href=http://guccihandbagsalejp.com/>グッチ キーケース ランキング</a> clhftp http://guccihandbagsalejp.com/ HbzOil <a href=http://jestinabagscheapjp.com/>j.estina リュック</a> axtxup http://jestinabagscheapjp.com/
, 2013/01/25 22:53
EfqHcb <a href=http://mcmbagoutletjp.com/>MCM リュック ピンク</a> yuflmq http://mcmbagoutletjp.com/ SluKie <a href=http://pradaforcheapjp.com/>プラダ 財布 新作 2012 秋冬</a> rigcfu http://pradaforcheapjp.com/ KkhVpw <a href=http://jplouisvuittoncheap.com/>ヴィトン 長財布 レディース</a> nhixxb http://jplouisvuittoncheap.com/ MamLss <a href=http://jestinabaginjp.com/>J.estinaハンドバッグ</a> uavakh http://jestinabaginjp.com/ WxfUrl <a href=http://coachbagforsalejp.com/>コーチ アウトレット バッグ</a> ejmqwh http://coachbagforsalejp.com/ DtnYwj <a href=http://cheapmcmbagsalejp.com/>MCM 財布 メンズ</a> cofqrv http://cheapmcmbagsalejp.com/ YlnLns <a href=http://jppradacheap.com/>プラダ トート ピンク</a> veloum http://jppradacheap.com/ YxcSds <a href=http://pradahandbagsalejp.com/>プラダ トート バッグ</a> endytl http://pradahandbagsalejp.com/
, 2013/01/25 23:03
ZbwLhz <a href=http://mcmbagoutletjp.com/>MCM 財布 2丁拳銃</a> icglre http://mcmbagoutletjp.com/ CsqJmf <a href=http://pradaforcheapjp.com/>プラダ バッグ 新作 2012</a> ttnwmg http://pradaforcheapjp.com/ ArpLix <a href=http://jplouisvuittoncheap.com/>ルイヴィトン</a> clabrj http://jplouisvuittoncheap.com/ PqzDmr <a href=http://jestinabaginjp.com/>j.estina 通販</a> nutpov http://jestinabaginjp.com/ WoaTss <a href=http://coachbagforsalejp.com/>コーチ 財布 メンズ</a> dhsqug http://coachbagforsalejp.com/ UjdXul <a href=http://cheapmcmbagsalejp.com/>MCM リュック ピンク</a> pbuhey http://cheapmcmbagsalejp.com/ AyeVoz <a href=http://jppradacheap.com/>プラダ バッグ デニム</a> moobby http://jppradacheap.com/ IytRek <a href=http://pradahandbagsalejp.com/>プラダ トート ピンク</a> cwvtdn http://pradahandbagsalejp.com/
, 2013/01/26 09:16
NteCgb <a href=http://jestinasalejp.com/>j.estina</a> zqvplu http://jestinasalejp.com/ ZfpWmw <a href=http://salewigjp.com/>ウィッグ 通販 ボブ</a> avbzks http://salewigjp.com/ MiwFdv <a href=http://cheapcoachbagjp.com/>コーチ キーケース 値段</a> ibtdol http://cheapcoachbagjp.com/ WswOos <a href=http://guccisalejapan.com/>グッチ キーケース レディース</a> kelgll http://guccisalejapan.com/ FqaPle <a href=http://cheappradabagsalejp.com/>プラダ キーケース 値段</a> epbxkm http://cheappradabagsalejp.com/ NwpTxq <a href=http://cheapguccibagsalejp.com/>グッチ 財布 アウトレット</a> UjcFbq <a href=http://chromeheartsforjp.com/>クロムハーツ リング</a> ctwhan http://chromeheartsforjp.com/ UhoUdv <a href=http://guccijpforsale.com/>グッチ バッグ ショルダー</a> czrjco http://guccijpforsale.com/
, 2013/01/26 09:20
LbmGku <a href=http://monsterbeatsforjp.com/>モンスター イヤホン 激安</a> oqgmkh http://monsterbeatsforjp.com/ ZwdQqd <a href=http://mbtforsalejp.com/>mbt 激安</a> qmomxm http://mbtforsalejp.com/ KcaRtb <a href=http://gorossalejp.com/>ゴローズ 財布 カスタム</a> qucxuv http://gorossalejp.com/ UonErm <a href=http://louisvuittonjpcheap.com/>ルイヴィトン 財布 ダミエ</a> rgzplu http://louisvuittonjpcheap.com/ SfkIjq <a href=http://chromeheartsforjp.com/>monster ヘッドホン</a> huqcno http://chromeheartsforjp.com/ EfyWdh <a href=http://adidassoccershoesjp.com/>サッカー 通販</a> haazed http://adidassoccershoesjp.com/ IqfUpg <a href=http://lovesoccershoesjp.com/>サッカーシューズ キッズ</a> kovdjs http://lovesoccershoesjp.com/ XygAdu <a href=http://nikesoccershoesjp.com/>サッカー最新スパイク</a> tmusnk http://nikesoccershoesjp.com/
, 2013/01/26 09:21
GsuUyc <a href=http://mcmbagoutletjp.com/>MCM 店舗</a> jelmlg http://mcmbagoutletjp.com/ QgoLyv <a href=http://pradaforcheapjp.com/>プラダ バッグ メンズ</a> xxqqyv http://pradaforcheapjp.com/ PbxXqx <a href=http://jplouisvuittoncheap.com/>ルイヴィトン 店舗 名古屋</a> imsfhn http://jplouisvuittoncheap.com/ PzkRqn <a href=http://jestinabaginjp.com/>j.estina 通販</a> nlgalp http://jestinabaginjp.com/ TltOif <a href=http://coachbagforsalejp.com/>コーチ アウトレット メンズ</a> enqili http://coachbagforsalejp.com/ VivFpq <a href=http://cheapmcmbagsalejp.com/>MCM 店舗 名古屋</a> aqtdbi http://cheapmcmbagsalejp.com/ NytZvf <a href=http://jppradacheap.com/>プラダ 財布 メンズ</a> kudzcd http://jppradacheap.com/ ConAoe <a href=http://pradahandbagsalejp.com/>プラダ アウトレット 佐野</a> wzxhcb http://pradahandbagsalejp.com/
, 2013/01/26 09:21
PrkPkx <a href=http://jpmcmsale.com/>MCM アウトレット</a> txzipq http://jpmcmsale.com/ LrwKdm <a href=http://jpmcmbagsale.com/>MCM コピー</a> nxuiyh http://jpmcmbagsale.com/ ZqpGpg <a href=http://chromeheartsforjp.com/>クロムハーツ キーパーリング</a> czhcvv http://chromeheartsforjp.com/ EsbDky <a href=http://chromeheartsinjp.com/>クロムハーツウオレットチェーン</a> xffaxv http://chromeheartsinjp.com/ ZbbTpz <a href=http://cheapjpgucci.com/>グッチ キーケース アウトレット</a> kevtde http://cheapjpgucci.com/ IxtUex <a href=http://jestinabagsjp.com/>j.estina ピアス</a> hgijwx http://jestinabagsjp.com/ IknOfb <a href=http://guccihandbagsalejp.com/>グッチ バッグ 2012</a> zgbhue http://guccihandbagsalejp.com/ UcgTbb <a href=http://jestinabagscheapjp.com/>少女時代 バッグ</a> rnltlv http://jestinabagscheapjp.com/
Enter your comment
 
 
programming/network/phpでxmlを解析する.txt · 最終更新: 2009/08/09 10:42 by daisukeh
 

Recent changes RSS feed Donate Powered by PHP Valid XHTML 1.0 Valid CSS
Driven by DokuWiki Powered by Google do yourself a favour and use a real browser - get firefox ! GIMP is the GNU Image Manipulation Program. Adobe Flex smarty : Template Engine