XPressME Integration Kit

フォーラム

Re: d3blogからのインポート

#3341
toemon
キーマスター

エラーメッセージのPCDATA invalid Char 26

については不明ですが、

取得した、XMLファイルのエラー部分を修正したものを、送付させていただきました。

備考

ホームページ[井上雄彦 最後のマンガ展 重版 大阪]の文字をコピーして他のエディタに貼り付けてみると、

「大阪天保山にある」の「あ」と「る」の間に制御コード 0x1A

「玄関を入ると」の「を」と「入り」の間に制御コード 0x1A 0x7F 0x1A

が、挿入されています。

これがどうして入力されたのかは定かではありませんが、

ローカル環境のD3Blogで同様の文字を入力して再現性はありません。

D3Blogの編集画面で該当の箇所をBackspaceで消していくと、カーソル位置が変わらず、余計な文字が入っているのが解ると思います。

RSSインポート用のXMLファイルは以下のようにして取得しました

  1. D3BlogのRSSを全文出力に変更

    XOOPS_TRUST_PATH/modules/d3blog/main/rss.phpの74行目あたり

    <code>$item['description'] = xoops_convert_encoding($entry->pingExcerpt());</code>

    <code>$item['description'] = xoops_convert_encoding($entry->renderContents(false,'e'));</code>

    に変更

  2. 全記事を出力させるのに記事数制限を解除する

    XOOPS_TRUST_PATH/modules/d3blog/main/rss.phpの59行目あたり

    <code>$limit = intval($myModule->getConfig('max_rdf'));</code>

    <code>$limit = 0;</code>

    に変更

  3. インポート用に出力の並びを古い記事から最初に出現するようにする。

    XOOPS_TRUST_PATH/modules/d3blog/main/rss.phpの66行目あたり

    <code>$criteria->setOrder('DESC');</code>

    <code>$criteria->setOrder('ASC');</code>

    に変更

  4. カテゴリーと著者名を取得できるように変更

    • rss.phpにカテゴリーと著者名出力を追加

      XOOPS_TRUST_PATH/modules/d3blog/main/rss.phpの69行目あたり

      <code>foreach($entries as $entry) {<br />
      $item['title'] = xoops_convert_encoding(htmlspecialchars($entry->getVar('title', 'n'), ENT_QUOTES));<br />
      $item['link'] = sprintf('%s/modules/%s/details.php?bid=%d', XOOPS_URL, $mydirname4show, $entry->bid());<br />
      $item['guid'] = sprintf('%s/modules/%s/details.php?bid=%d', XOOPS_URL, $mydirname4show, $entry->bid());<br />
      $item['pubdate'] = d3blog_rfc2822_date($entry->published());<br />
      $item['description'] = xoops_convert_encoding($entry->renderContents(false,'e'));<br />
      $items[] = $item;<br />
      }</code>

      <code>$all_categories =& $cat_handler->getAll();<br />
      foreach($entries as $entry) {<br />
      $category =& $all_categories[$entry->cid()];<br />
      $arr =& $entry->getStructure();<br />
      $item['title'] = xoops_convert_encoding(htmlspecialchars($entry->getVar('title', 'n'), ENT_QUOTES));<br />
      $item['link'] = sprintf('%s/modules/%s/details.php?bid=%d', XOOPS_URL, $mydirname4show, $entry->bid());<br />
      $item['guid'] = sprintf('%s/modules/%s/details.php?bid=%d', XOOPS_URL, $mydirname4show, $entry->bid());<br />
      $item['pubdate'] = d3blog_rfc2822_date($entry->published());<br />
      $item['description'] = xoops_convert_encoding($entry->renderContents(false,'e'));<br />
      $item['category'] = xoops_convert_encoding($category->getVar('name'));<br />
      $item['creator'] = xoops_convert_encoding($arr['blogger']['uname']);<br />
      $items[] = $item;<br />
      }</code>

      に変更

    • テンプレートd3blog_main_rss.xmlにカテゴリーと著者名出力を追加

      テンプレートd3blog_main_rss.xmlを

      <code><?xml version="1.0" encoding="UTF-8"?><br />
      <rss version="2.0"><br />
      <channel><br />
      <title><{$feed.title}></title><br />
      <link><{$feed.link}></link><br />
      <description><{$feed.desc}></description><br />
      <lastBuildDate><{$feed.lastbuild}></lastBuildDate><br />
      <docs>http://backend.userland.com/rss/</docs><br />
      <generator><{$feed.generator}></generator><br />
      <category><{$feed.category}></category><br />
      <language><{$feed.lang}></language><br />
      <{if $logo_url != ""}><br />
      <image><br />
      <title><{$feed.title}></title><br />
      <url><{$feed.logo_url}></url><br />
      <link><{$feed.link}></link><br />
      <width><{$feed.logo_width}></width><br />
      <height><{$feed.logo_height}></height><br />
      </image><br />
      <{/if}><br />
      <br />
      <{foreach item=item from=$entries}><br />
      <item><br />
      <title><{$item.title}></title><br />
      <link><{$item.link}></link><br />
      <pubDate><{$item.pubdate}></pubDate><br />
      <author><{$item.creator}></author><br />
      <category><{$item.category}></category><br />
      <description><{$item.description}></description><br />
      </item><br />
      <br />
      <{/foreach}><br />
      </channel><br />
      </rss></code>

      に修正

RSSインポートを行う際に、

件数が多いと、処理に時間がかかり、

<code>Fatal error: Maximum execution time of ** seconds exceeded in ....</code>

が表示されることがあります。(**部はサーバーの設定により異なります)

この場合の対処方法としては、

  • php.iniのmax_execution_timeを設定し直す(0を設定した場合無制限)
  • インポート用のXMLファイルの<item> … </item>の部分をいくつかに分けて複数回に分けて処理する。

等をおこないインポートします。

なお、WordPressのRSSインポータは著者名まではインポートしていません。