Jump to content

XML-RPC Help


OldManRiver

Recommended Posts

All,

 

Was needing to write to ISP and index into Joomla and WordPress for several sites.  Originally opened thread:

 

http://www.phpfreaks.com/forums/index.php/topic,313496.0.html

 

I found the XML-RPC code libraries and it seems to be the answer to my problem.  I downloaded the 'IXR_Library.php' library from:

 

http://scripts.incutio.com/xmlrpc/

 

Installed and tweaked.  Ran this sample test code:

<?php
   echo "Beginning the process! <br>";
   include ('IXR_Library.php');
   $url_lnk = 'http://mysite.com/xmlrpc.php';
   $uid_val = 'myuser';
   $pwd_val = 'mypwd';
   $title="XML-RPC Test Page - Test Draft Entry";
   $body="Some test text.";
   $catg="Uncategorized";
   $client = new IXR_Client($url_lnk);
   if (!$client->query('wp.getCategories','', $uid_val,$pwd_val)) {
      die ('An error occurred - '.$client->getErrorCode().":".
      	   $client->getErrorMessage());
   }
   $res = $client->getResponse();
   $content = array('title'=>$title,
      	    'description'=>"$body<p>Hello World!</p>",
	    'mt_allow_comments'=>0,  // 1 to allow comments
	    'mt_allow_pings'=>0,  // 1 to allow trackbacks
	    'post_type'=>'page',
	    'post_parent'=>52,
	    'mt_keywords'=>$keywords,
	    'categories'=>$catg);
   if (!$client->query('metaWeblog.newPost','',$uid_val,$pwd_val,$content, false)) {
      die('An error occurred - '.$client->getErrorCode().":".$client->getErrorMessage());
   }
   $res = $client->getResponse();    //with Wordpress, will report the ID of the new post
   echo "Process Ended! <br>";
?>

which ran fine.

 

I then put this into my other code as a function of:

   function put_wp_xml($parm_ray) {
      // Called from line 1185
      $url = $parm_ray['L'];
      $uid = $parm_ray['U'];
      $pwd = $parm_ray['P'];
      $bod = $parm_ray['B'];
      include_once('IXR_Library.php');
      $client = new IXR_Client($url);
      $client->debug = true;
      if (!$client->query('wp.getCategories','', $uid,$pwd)) {
 die ('An error occurred - '.$client->getErrorCode().":".
      $client->getErrorMessage());
      }
      $res = $client->getResponse();
      $cot = array ('title'=>$parm_ray['T'],
     	    'description'=>$parm_ray['B'],       // Content/Article
	    'mt_allow_comments'=>$parm_ray['M'], // 1 to allow comments
	    'mt_allow_pings'=>$parm_ray['G'],    // 1 to allow trackbacks
	    'post_type'=>$parm_ray['Y'],         // Type = Post or Page
	    'post_parent'=>$parm_ray['I'],       // Parent ID for subpage
	    'mt_keywords'=>$parm_ray['K'],       // Keyword Array
	    'categories'=>$parm_ray['C']);       // Category Array
      if (!$client->query('metaWeblog.newPost','',$uid,$pwd,$cot, false)) {
 die ("An error occurred - ".$client->getErrorCode().
      ":".$client->getErrorMessage());
      }
      $res = $client->getResponse();    //with Wordpress, will report the ID of the new post
   }        // end function

and call it with:

 

         foreach ($fls as $file) {		// loop through the files
            $lines   = file($file);
            $fil_lns = "";
            foreach ($lines as $lval) {
               //$fil_lns .= $lval."\n";
               $fil_lns .= htmlspecialchars($lval);
            }  // end foreach $lines
            $row_val = $row_lin[$n];
    $url_sit = $row_val['seo_site'];
    $url_lnk = $row_val['seo_thst'];
    $uid_val = $row_val['seo_tuid'];
    $pwd_val = $row_val['seo_tpwd'];
            if (strpos($url_lnk,'abcarz')) { continue; }
    $title   = get_title($file);
    $catg    = "Uncategorized";
    //$body="Some test text.";
            $put_lin = array (L=>$url_lnk,U=>$uid_val,P=>$pwd_val,
            		      T=>$title,B=>$fil_lns,M=>0,G=>0,Y=>'page',
                              I=>'',K=>'',C=>$catg);
    $rc = put_wp_xml($put_lin);
            $x++;
            if ($x==$lm) { break; }		// Break on file limit
         }  // end foreach

 

Originally I did not have the nested "foreach loop", so was only getting the filename transferred.  When I added the nested foreach loop to get the file contents, I started getting this error:

 

An error occurred - -32700:parse error. not well formed

 

I've searched around for help on this error and as of now have nothing.

 

Hope someone can help with insite to this.

 

Thanks!

 

OMR

Link to comment
Share on other sites

Neil,

 

Please be specific.  I found one post, searching google, that says this is due to the content containing the '#' symbol, so wrote this function:

   function fix_pound($myline) {
      $q_idx = 0;
      $q_pos = strpos($myline,"#",$q_idx);
      while ($q_pos) {
 $f_str = substr($myline,0,$q_pos);
 $e_str = substr($myline,$q_pos);
         $myline = $f_str.trim("\ ").$e_str;
 $q_idx = $q_pos;
 $q_pos = strpos($myline,"#",$q_idx+2);
      }
      return $myline;
   }           // end function

but still get the error.  When I set the content value blank or to a fixed string I hand enter it works fine so know it is not a server parse error, which some posts I found suggested.

 

Just need to understand all the special characters the XML parser blows on.

 

Thanks!

 

OMR

Link to comment
Share on other sites

Display the xml on screen and exit prior to parsing. Then we can look at the formatting.

Neil,

 

Ah yes you mean add the "debug" line like so:

      $client = new IXR_Client($url);
      $client->debug = true;

Ah but what I found is this code resolves, when I feed my source to this function:

   function xml_entities($text, $charset = 'Windows-1252'){
      $text = htmlentities($text, ENT_COMPAT, $charset, false); // Encode html chars
      $arr_xml_special_char = array (""","&","'",
      				     "<",">");
      $arr_xml_special_char_regex = "(?";                       // Build the regex
      foreach($arr_xml_special_char as $key => $value){
         $arr_xml_special_char_regex .= "(?!$value)";
      }
      $arr_xml_special_char_regex .= ")";
      $pattern = "/$arr_xml_special_char_regex&(".
      		 "[a-zA-Z0-9]+;)/";                             // Scan for non XML
      $replacement = '&${1}';                               // Replace non XML
      return preg_replace($pattern, $replacement, $text);
   }  // end function

and I can even fix with this abbreviated function of:

   function fix_xml ($text, $charset = 'Windows-1252'){
      $text = htmlentities($text, ENT_COMPAT, $charset, false); // Encode html chars
      //$text = htmlspecialchars($text, ENT_COMPAT, $charset, false); // Encode html chars
      return $text;
   }  // end function

I tried fixing it with just the "htmlspecialchars" but still get the errors and when the code/context from this is submitted to WordPress all the html formatting is lost, and it must be maintained.

 

Appears I am looking only to convert specific HTML codes to their "&xxx;" equivalents.  Any ideas on which codes actually need converting to meet the XML formatting rules?

 

Thanks!

 

OMR

Link to comment
Share on other sites

If you are putting HTML into XML you should enclose it within CDATA. This will tell the parser not to try and parse it as the HTML contains elements that are seen as XML such as < > or invalid characters such as &.

http://www.w3schools.com/xml/xml_cdata.asp

 

There is no need to try and convert any entities if you do this.

Link to comment
Share on other sites

If you are putting HTML into XML you should enclose it within CDATA. This will tell the parser not to try and parse it as the HTML contains elements that are seen as XML such as < > or invalid characters such as &.

http://www.w3schools.com/xml/xml_cdata.asp

 

There is no need to try and convert any entities if you do this.

Neil,

 

There might be a easier way.  If WordPress has an XML-RPC option to decode my HTML, then encoding is fine.  I'm looking to see if that option exists; it should.

 

OMR

Link to comment
Share on other sites

All,

 

Also wrote this up at:

 

http://wordpress.org/support/topic/xml-rpc-question?replies=11#post-1775378

 

and now down to just finding the "Decode" option in the wp.xml-rpc library that envokes the

 

"html_entity_decode()"

 

PHP function to restore the encoded HTML.  Since XML requires the encoding or it errors, I'm sure the WP programmers did not overlook this option, so just need to know what it is and how to call it so my code is right once uploaded.

 

If you know this option, please post ASAP!

 

Thanks!

 

OMR

Link to comment
Share on other sites

This thread is more than a year old. Please don't revive it unless you have something important to add.

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.