最近Compact Framework用XML-RPCクライアントライブラリを書いているのですが、WordPress XML-RPC APIのwp.uploadFileメソッドを使ってファイルを送信しようとした場合、パースエラーが発生する現象に悩まされました。ファイルが小さい場合は問題がないのですが、ファイルのサイズが大きくなるとパースエラーを返すという現象です。

調べてみたところ、WordPressのXML-RPC関係の処理を担っているIncutio XML-RPC Library for PHPがどうやら問題の原因のようで、class-IXR.php(wp-includes以下にあります)で定義されているIXR_Messageクラスのparseメソッドのところでエラーが返されているようです。

function parse() {
    // first remove the XML declaration
    $this->message = preg_replace('/<?xml(.*)??'.'>/', '', $this->message);
    if (trim($this->message) == '') {
        return false;
    }
//以下省略

どうもエラーが起きる場合は157行目を境に$this->messageの内容が空になっているようで、それが原因で159行目でreturn falseされてしまっているようです。なぜファイルが大きい場合だけそのようなことになるのかはちょっとよく分からないのですが(不適切な正規表現なのでしょうか?)、とりあえずPOSTするXMLからXML宣言を削除し、methodCall要素以下だけのXMLフラグメントとして送信するようにしたところ上手くいくようになりました。参考まで。

追記:

WP-XMLRPCのパースエラーのデモンストレーション用コード – SharpLab.を書きました。