I have oai.php page.Now when i type in url oai.php?verb=identify then want to show the contents in identify.xml.But i want the same url(oai.php?verb=identify) when i view the identify.xml.Below code showing only data of xml.
<?php
include "config.php";
$id= $_GET['verb'];
//echo $id;
if($id=="identify")
{
$date_mod = gmdate("Y-m-d\TH:i:s\Z");
$rss_txt ='<?xml version="1.0" encoding="utf-8"?>
<OAI-PMH xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.openarchives.org/OAI/2.0/" xsi:schemaLocation="http://www.openarchives.org/OAI/2.0/ http://www.openarchives.org/OAI/2.0/OAI-PMH.xsd">
<responseDate>' .$date_mod. '</responseDate>
<request verb="Identify">http://mywebsite.org/oai</request>
<Identify>
<repositoryName>mydomain</repositoryName>
<baseURL>mywesite.com</baseURL>
<protocolVersion>2.0</protocolVersion>
<adminEmail>myemail</adminEmail>
<earliestDatestamp>'.$date_mod.'</earliestDatestamp>
<deletedRecord>transient</deletedRecord>
<granularity>YYYY-MM-DDThh:mm:ssZ</granularity>
</Identify>
</OAI-PMH>';
}
else if($id=="ListRecords")
{
include "config.php";
$date_mod = gmdate("Y-m-d\TH:i:s\Z");
$viewss1=$con->query("SELECT COUNT(upload_paper_id) FROM upload_papers");
$cview1=$viewss1->fetch_row();
$countt1=$cview1[0];
$rss_txt = '<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="http://localhost/oai-file/data/oai2.xsl" ?>
<OAI-PMH xmlns="http://www.openarchives.org/OAI/2.0/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.openarchives.org/OAI/2.0/ http://www.openarchives.org/OAI/2.0/OAI-PMH.xsd">
<responseDate>' .$date_mod. '</responseDate>
<request verb="ListRecords" metadataPrefix="oai_dc">http:mywebsite.org</request>
<ListRecords>';
$query = "SELECT * FROM upload_papers";
$result=$con->query($query);
while($values_query = mysqli_fetch_assoc($result))
{
$year= $values_query['year'];
$upload_paper_id= $values_query['upload_paper_id'];
$rss_txt = '<record>
<header>
<identifier>' .$upload_paper_id. '</identifier>
<datestamp>' .$date_mod. '</datestamp>
<setSpec>mydoc8:BIH</setSpec>
</header>
<metadata>
<oai_dc:dc
xmlns:oai_dc="http://www.openarchives.org/OAI/2.0/oai_dc/"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.openarchives.org/OAI/2.0/oai_dc/
http://www.openarchives.org/OAI/2.0/oai_dc.xsd">
<dc:title xml:lang="en-US">' .$values_query['paper_title']. '</dc:title>
<dc:creator>' . $values_query['author_name']. '</dc:creator>
<dc:creator>' . $values_query['co_author_name']. '</dc:creator>
<dc:description xml:lang="en-US">' .$values_query['abstract']. '</dc:description>
<dc:publisher xml:lang="en-US">' .$values_query['journal_nam']. '</dc:publisher>
<dc:contributor xml:lang="en-US">' .$values_query['author_name']. '</dc:contributor>
<dc:type xml:lang="en-US">Article</dc:type>
<dc:format>application/pdf</dc:format>
<dc:identifier>http://mywebsite'.$year.'/article.php?page='.$upload_paper_id.'</dc:identifier>
<dc:language>en</dc:language>
</oai_dc:dc>
</metadata>
</record>';
}
$rss_txt = '<resumptionToken
completeListSize="'.$countt1.'"
cursor="0">'.$date_mod.'</resumptionToken>
</ListRecords>
</OAI-PMH>';
}
else if($id=="ListSets")
{
$rss_txt =file_get_contents("ListSets.xml");
}
header('Content-type: application/xml');
echo $rss_txt;
?>
Above code shows only the data of xml.The output attached below
And i want the output like
.If i type verb=identify in url then it want to show identify.xsd or xml file any one.Then i type Listsets Want to show the content in that page.if verb equal to empty want to show the identify page.Please help me.Its really irritating me.Thank u
There are a few problems with the code. The main thing is to set your header to be XML content type. This will tell the browser what to expect. But there are a few other issues.
$id= $_GET['verb'];
//echo $id;
if($id=="identify")
{
$date_mod = gmdate("Y-m-d\TH:i:s\Z");
$rss_txt ='<?xml version="1.0" encoding="utf-8"?>
<OAI-PMH xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.openarchives.org/OAI/2.0/" xsi:schemaLocation="http://www.openarchives.org/OAI/2.0/ http://www.openarchives.org/OAI/2.0/OAI-PMH.xsd">
<responseDate>' .$date_mod. '</responseDate>
<request verb="Identify">http://mywebsite.org/oai</request>
<Identify>
<repositoryName>mydomain</repositoryName>
<baseURL>mywesite.com</baseURL>
<protocolVersion>2.0</protocolVersion>
<adminEmail>myemail</adminEmail>
<earliestDatestamp>'.$date_mod.'</earliestDatestamp>
<deletedRecord>transient</deletedRecord>
<granularity>YYYY-MM-DDThh:mm:ssZ</granularity>
</Identify>
</OAI-PMH>';
}
else if($id=="ListRecords")
{
$rss_txt =file_get_contents("compend1.xml");
}
else if($id=="ListSets")
{
$rss_txt =file_get_contents("ListSets.xml");
}
header('Content-type: application/xml');
echo $rss_txt;
You had $rss_txt .= which with the . means append the string, which as you didn't declare it anywhere gives you the error about an undefined variable. Also with the content - XML needs to start right at the beginning of the string, so remove the whitespace.
The main one is having...
header('Content-type: application/xml');
But, for this to work properly, you need to ensure you comment out the echo, which I assume was some debugging code.
When doing an if - a single = is used to assign a value, so you need == to compare the values.
You can use $_GET[] to access the parameters rather than the way you were using, a lot simpler.
I've used file_get_contents() to fetch the data from those other files and moved the echo to the end so they all have the same logic.
Related
I was searching for a simple script to generate a dynamic sitemap when i came across what i have below:
<?php
header("Content-Type: application/xml; charset=utf-8");
echo '<?xml version="1.0" encoding="UTF-8"?>'.PHP_EOL;
echo '<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.sitemaps.org/schemas/sitemap/0.9 http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd">' .PHP_EOL;
function urlElement($url) {
echo '<url>'.PHP_EOL;
echo '<loc>'.$url.'</loc>'. PHP_EOL;
echo '<changefreq>weekly</changefreq>'.PHP_EOL;
echo '</url>'.PHP_EOL;
}
urlElement('https://www.example.com/sub1');
urlElement('https://www.example.com/sub2');
urlElement('https://www.example.com/sub2');
echo '</urlset>';
?>
The above code works perfectly to generate a sitemap for the specified urls but i need something that can loop through the specified urls and fetch all the links on them to create a single sitemap while ignoring duplicate links.
Store your URLs in an array then do a foreach() on the array and call urlElement($value); on the value within the loop.
<?php
function urlElement($url) {
echo '<url>'.PHP_EOL;
echo '<loc>'.$url.'</loc>'. PHP_EOL;
echo '<changefreq>weekly</changefreq>'.PHP_EOL;
echo '</url>'.PHP_EOL;
}
$urls = array(
"http://www.google.com",
"http://www.google.com/images",
"http://www.google.com/maps"
);
header("Content-Type: application/xml; charset=utf-8");
echo '<?xml version="1.0" encoding="UTF-8"?>'.PHP_EOL;
echo '<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.sitemaps.org/schemas/sitemap/0.9 http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd">' .PHP_EOL;
foreach($urls as $value) {
urlElement($value);
}
echo '</urlset>';
?>
I have written the following code to understand how php can be used to get and write data to xml files:
<?php
if (file_exists('/requests.xml')) {
$xml = simplexml_load_file('requests.xml');
foreach($xml->data->requests->request as $req)
{
print "Loop entered";
print $req->ip;
print $req->timelast;
}
}
?>
The xml file requests.xml follows:
<?xml version="1.0" encoding="utf-8"?>
<data>
<requests>
<request>
<ip>6.6.6.6</ip>
<timelast>2014-05-30 11:38:23</timelast>
</request>
</requests>
</data>
The problem is that when the script is run, it does not display anything in the browser. In fact it does not enter the loop.
I'm definitely missing something basic.
$xml will take your default node auto so no need to fetch result with data try
foreach($xml->requests->request as $req)
also change
if (file_exists('/requests.xml')) {
to
if (file_exists('requests.xml')) { // if same dir
i have tried like:-
$xml ='<?xml version="1.0" encoding="utf-8"?>
<data>
<requests>
<request>
<ip>6.6.6.6</ip>
<timelast>2014-05-30 11:38:23</timelast>
</request>
</requests>
</data>';
$xml = simplexml_load_string($xml);
foreach($xml->requests->request as $req)
{
print "Loop entered";
print $req->ip;
print $req->timelast;
}
output :- Loop entered6.6.6.62014-05-30 11:38:23
<?php
try
{
$feed = new SimpleXMLElement('requests.xml', null, true);
}
catch(Exception $e)
{
echo $e->getMessage();
exit;
}
foreach($feed->member as $property)
{
echo $property->id;
echo $property->lastName;
}
?>
XML :
1
MSDWEr
Not too sure what I'm doing wrong with parsing/reading an xml document.
My guess is that it's not standardized, and I'm going to need a different process to read anything from the string.
If that's the case, then I'm rather excited to learn how someone would read the xml.
Here's what I've got, and what I'm doing.
example.xml
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="someurl.php"?>
<response>
<status>Error</status>
<error>The error message I need to extract, if the status says Error</error>
</response>
read_xml.php
<?php
$content = 'example.xml';
$string = file_get_contents($content);
$xml = simplexml_load_string($string);
print_r($xml);
?>
I'm getting no result back from the print_r.
I switched the xml to something more standard, like:
<?xml version="1.0" encoding="ISO-8859-1"?>
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>
...and it worked fine. So I'm sure it's due to a non-standard format, passed back from the source I'm getting it from.
How would I extract the <status> and <error> tags?
Tek has a good answer, but if you want to use SimpleXML, you can try something like this:
<?php
$xml = simplexml_load_file('example.xml');
echo $xml->asXML(); // this will print the whole string
echo $xml->status; // print status
echo $xml->error; // print error
?>
EDIT: If you have multiple <status> and <error> tags in your XML, have a look at this:
$xml = simplexml_load_file('example.xml');
foreach($xml->status as $status){
echo $status;
}
foreach($xml->error as $error){
echo $error;
}
I'm assuming <response> is your root. If it isn't, try $xml->response->status and $xml->response->error.
I prefer to use PHP's DOMDocument class better.
Try something like this:
<?php
$xml = '<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="someurl.php"?>
<response>
<status>Error</status>
<error>The error message I need to extract, if the status says Error</error>
</response>';
$dom = new DOMDocument();
$dom->loadXML($xml);
$statuses = $dom->getElementsByTagName('status');
foreach ($statuses as $status) {
echo "The status tag says: " . $status->nodeValue, PHP_EOL;
}
?>
Demo: http://codepad.viper-7.com/mID6Hp
I have the xml code below:
<?xml version="1.0" encoding="UTF-8"?>
<santamaster>
<paths>
<thename >Agamemnonas</thename>
<soundpath startAt="0">sounds/namesounds/agamemnonas.mp3</soundpath>
<theage startAt="5000">sounds/ages/5.mp3</theage>
<theplace startAt="10000">sounds/places/ipiros.mp3</theplace>
<everyday startAt="15000">sounds/everyday/bravekid.mp3</everyday>
<youwill startAt="20000">sounds/youwill/listeryourparents.mp3</youwill>
<pic1 startAt="0">images/pic1.jpg</pic1>
<pic2 startAt="5000">images/pic2.jpg</pic2>
<pic3 startAt="10000">images/pic3.jpg</pic3>
<videofile>myvideo.mp4</videofile>
</paths>
</santamaster>
i am trying to echo this code through a php file and some variables:
<?php
session_start();
header('Content-type: text/xml');
echo '<?xml version="1.0" encoding="utf-8"?>';
echo'
<santamaster>
<paths>
<thename >Irene</thename>
<soundpath startAt="0">"'.$_SESSION['audiolink'].'"</soundpath>
<theage startAt="5000">"'.$_SESSION['age'].'"</theage>
<theplace startAt="10000">"'.$_SESSION['thelocation'].'"</theplace>
<everyday startAt="15000">"'.$_SESSION['dailylife'].'"</everyday>
<youwill startAt="20000">"'.$_SESSION['YOU_WILL'].'"</youwill>
<pic1 startAt="0">"'.$_SESSION['pimagepath'].'"</pic1>
<pic2 startAt="5000">"'.$_SESSION['eoneimagepath'].'"</pic2>
<pic3 startAt="10000">"'.$_SESSION['etwoimagepath'].'"</pic3>
<videofile>santavideo/sample.mp4</videofile>
</paths>
</santamaster>';
?>
But nothing happend..
Its importan to load the variables in xml through session, the session variables are working.. I need it to load it in an flash movie!
Thank you all!
I am getting the correct response from Flickr which is:
<?xml version="1.0" encoding="utf-8" ?>
<rsp stat="ok">
<photoset id="72157630469695108" owner="15823425#N00" primary="5110549866" secret="fd716fb5ee" server="1136" farm="2" photos="101" count_views="67" count_comments="0" count_photos="101" count_videos="0" can_comment="0" date_create="1341701808" date_update="1345054078">
<title>Montana</title>
<description />
</photoset>
</rsp>
For some reason I can't get the title, I've tried the following:
$album_info = simplexml_load_file($album_info_xml); // this is what the response is stored in
echo $album_info['photoset']['title'];
foreach($album_info->photoset as $ps) {
echo $ps['title'];
}
And a couple of other crazy things, I know it's something silly but don't know what it is I have missed.
Response can be seen here: http://www.flickr.com/services/api/explore/flickr.photosets.getInfo
Just use 72157630469695108 as the set id or alternatively use this url: http://api.flickr.com/services/rest/?method=flickr.photosets.getInfo&api_key=7ccedd2c89ca10303394b8085541d9de&photoset_id=72157630469695108
You should use SimpleXMLElement directly, then xpath to find your node.
$album_info = new SimpleXMLElement('<?xml version="1.0" encoding="utf-8" ?>
<rsp stat="ok">
<photoset id="72157630469695108" owner="15823425#N00" primary="5110549866" secret="fd716fb5ee" server="1136" farm="2" photos="101" count_views="67" count_comments="0" count_photos="101" count_videos="0" can_comment="1" date_create="1341701808" date_update="1345054078">
<title>Montana</title>
<description />
</photoset>
</rsp>'); // this is what the response is stored in
$result = $album_info->xpath('//title');
foreach ($result as $title)
{
echo $title . "\n";
}
Working example.
For anyone in the same position, this did the trick
$albumName = $album_info->photoset->title;