tags:

views:

310

answers:

2

Hello

I will try to explain as well as possible what I'm trying to do.

I have a folder on a server with about 100 xml files. These xml files are content pages with text and references to attachment filenames on the server that will be pushed to a wiki through an API.

It's all working fine 1 XML file at a time but I want to loop through each one and run my publish script on them.

I tried with opendir and readdir and although it doesn't error it only picks up the one file anyway.

Could someone give me an idea what I have to do. I'm very new to PHP, this is my first PHP project so my code is probably not very pretty!

Here's my code so far.

The functions that gets the XML content from the XML file:

<?php
function gettitle($file)
{
    $xml = simplexml_load_file($file);
    $xmltitle = $xml->xpath('//var[@name="HEADLINE"]/string');
    return $xmltitle[0];
}

function getsummary($file)
{
    $xml = simplexml_load_file($file);
    $xmlsummary = $xml->xpath('//var[@name="summary"]/string');
    return $xmlsummary[0];
}

function getsummarymore($file)
{
    $xml = simplexml_load_file($file);
    $xmlsummarymore = $xml->xpath('//var[@name="newslinetext"]/string');
    return $xmlsummarymore[0];
}

function getattachments($file)
{
    $xml = simplexml_load_file($file);
    $xmlattachments = $xml->xpath('//var[@name="attachment"]/string');
    return $xmlattachments[0];
}
?>

Here's the main publish script which pushes the content to the wiki:

<?php
// include required classes for the MindTouch API
include('../../deki/core/dream_plug.php');
include('../../deki/core/deki_result.php');
include('../../deki/core/deki_plug.php');

//Include the XML Variables
include('loadxmlfunctions.php');

//Path to the XML files on the server
$path = "/var/www/dekiwiki/skins/importscript/xmlfiles";

// Open the XML file folder 
$dir_handle = @opendir($path) or die("Unable to open $path");

// Loop through the files
while ($xmlfile = readdir($dir_handle)) { 
if($xmlfile == "." || $xmlfile == ".." || $xmlfile == "index.php" )
    continue;

//Get XML content from the functions and put in the initial variables
$xmltitle = gettitle($xmlfile);
$xmlsummary = getsummary($xmlfile);
$xmlsummarymore = getsummarymore($xmlfile);
$xmlattachments = getattachments($xmlfile);

//Build the variables for the API from the XML content

//Create the page title - replace spaces with underscores
$pagetitle = str_replace(" ","_",$xmltitle);

//Create the page path variable
$pagepath = '%252f' . str_replace("'","%27",$pagetitle);

//Strip HTML from the $xmlsummary and xmlsummarymore
$summarystripped = strip_tags($xmlsummary . $xmlsummarymore, '<p><a>');
$pagecontent = $summarystripped;

//Split the attachments into an array
$attachments = explode("|", $xmlattachments);

//Create the variable with the filenames
$pagefilenames = '=' . $attachments;

$pagefilenamefull = $xmlattachments;

//Create the variable with the file URL - Replace the URL below to the correct one
$pagefileurl = 'http://domain/skins/importscript/xmlfiles/';

//authentication
$username = 'admin';
$password = 'password';

// connect via proxy
$Plug = new DreamPlug('http://domain/@api');
// setup the deki api location
$Plug = $Plug->At('deki');

//authenticate with the following details
$authResult = $Plug->At('users', 'authenticate')->WithCredentials($username, $password)->Get();
$authToken = $authResult['body'];
$Plug = $Plug->With('authtoken', $authToken);

// Upload the page content - http://developer.mindtouch.com/Deki/API_Reference/POST:pages//%7Bpageid%7D//contents
$Plug_page = $Plug->At('pages', '=Development%252f' . $pagetitle, 'contents')->SetHeader('Expect','')->Post($pagecontent);

// Upload the attachments - http://developer.mindtouch.com/MindTouch_Deki/API_Reference/PUT:pages//%7Bpageid%7D//files//%7Bfilename%7D
for($i = 0; $i < count($attachments); $i++){
    $Plug_attachment = $Plug->At('pages', '=Development' . $pagepath, 'files', '=' . $attachments[$i])->SetHeader('Expect','')->Put($pagefileurl . $attachments[$i]);
}

}

//Close the XMl file folder
closedir($dir_handle);

?>

Thanks for any help!

+1  A: 

Try changing your while loop to and see if that helps out better:

while (false !== ($xmlfile = readdir($dir_handle)))

Let me know.

EDIT:

By using the old way, there could have been a directory name that could have evaluated to false and stopped the loop, the way I suggested is considered the right way to loop over a directory while using readdir taken from here

Anthony Forloney
Thanks! I will try this and let you know.
Johannes
This worked worked great. Thanks aforloney.
Johannes
Not a problem, glad it worked out for you.
Anthony Forloney
+2  A: 

To traverse a directory of XML files you can just do:

$files = glob("$path/*.xml");

foreach($files as $file)
{
    $xml = simplexml_load_file($file);

    $xmltitle = gettitle($xml);
    $xmlsummary = getsummary($xml);
    $xmlsummarymore = getsummarymore($xml);
    $xmlattachments = getattachments($xml);
}

I also recommend you make a minor adjustment to your code so simplexml doesn't need to parse the same file four times to get the properties you need:

function gettitle($xml)
{
    $xmltitle = $xml->xpath('//var[@name="HEADLINE"]/string');
    return $xmltitle[0];
}

function getsummary($xml)
{
    $xmlsummary = $xml->xpath('//var[@name="summary"]/string');
    return $xmlsummary[0];
}

function getsummarymore($xml)
{
    $xmlsummarymore = $xml->xpath('//var[@name="newslinetext"]/string');
    return $xmlsummarymore[0];
}

function getattachments($xml)
{
    $xmlattachments = $xml->xpath('//var[@name="attachment"]/string');
    return $xmlattachments[0];
}
Kevin
Thanks Kevin, I'll try your code as well. And thanks for the tips on the functions that will help a lot.
Johannes
This worked great and made the code a bit cleaner!
Johannes
Glad to hear that! :)
Kevin