1

I have been working on a project that displays data in an XML file. (It's kind of like an API). I know how to parse XML with PHP, and how to make an XML file in PHP, but they don't work together. :)

Basically, I have two files: parse.php and xml.php.

xml.php grabs info from a MySQL database, and outputs it as XML.

parse.php loads and parses xml.php and outputs it as HTML.

If I run parse.php, it does not load xml.php. However, if I copy the outputted XML (from xml.php) and save it as a xml.xml file (and change the filename in parse.php to 'xml.xml') it works. I'd really appreciate any help.

Content of parse.php:

<?php

    $doc = "xml.php";

    $doc = @simplexml_load_file($doc) or die("Server Error: Recipe not found!");

    $title = $doc->title;

    echo $title

?>

Content of xml.php:

<?php

    header("Content-type: text/xml");

    $dbc = mysql... //gets data from database

    echo "<!DOCTYPE..."; //xml stuff here

    echo "<title>" . $dataFromMySQL . "</title>";

?>

The database connection works, and the DOCTYPE in the XML is ok, so that's not the problem.

Again, I only get the problem when I generate XML dynamically using PHP. If it's a .XML file, it works fine.

Can anyone help me?

Thanks.

1
  • you should write your xml generating code as a function - load it with a include on the program file you will process it, and call that function to get the xml contents. What you are trying to do is a mess. Commented May 24, 2012 at 18:20

4 Answers 4

5

simplexml_load_file will try to actually load the php contents of the xml.php file. It will not run that file first. You need to do some rewriting or use this ugly solution:

ob_start();
include 'xml.php';
$xml = ob_get_clean();

$doc = simplexml_load_string($xml);
//...

NOTE: I like @lonesomeday's proposed solution better, it will just require more rewriting.

Sign up to request clarification or add additional context in comments.

Comments

3
@simplexml_load_file($doc);

That is where your problem is. This does not execute xml.php, but attempts to parse that file -- the PHP code that you've written -- as XML. Obviously (since it isn't XML) this won't work.

You have to find a way of getting the output from executing xml.php into parse.php.

The easy way to do this would be to change all your echo calls into $xml .= calls, and simply include xml.php into parse.php.

// xml.php
$xml = '';
$xml .= "<!DOCTYPE..."; //xml stuff here

$output .= "<title>" . $dataFromMySQL . "</title>";

// parse.php
include('xml.php');

simplexml_load_string($xml);

Note that your problem here shows the foolishness of using the error suppression operator @. If you hadn't used it, PHP would have shown you various errors which would have helped you to realise what the problem was.


Addendum: it occurs to me that the best way actually is to forget about the pointless XML step along the way and just convert the database output into HTML.

2 Comments

@Caleb There's no reason why you couldn't have the data obtained in one file and two other files that use the data, one converting it into HTML and the other into XML. That's called separation of concerns and is one of the fundamentals of good coding practice.
Great! Thanks so much for everyone's fast (and helpful) replies!
1

If you want to do this without rewriting xml.php, you can get PHP to process the file by accessing via url:

$doc = file_get_contents("http://localhost/xml.php");

1 Comment

Assuming you want to do this without rewriting xml.php, use Explosion Pills's answer. Doing this with file_get_contents (doing a needless HTTP request and slowing your page down considerably) is a very poor way to do this.
0

You're literally loading the local file. Unless you evaluate it, the code doesn't run, so you'll just get the code itself.

You could use CURL to download xml.php over HTTP, or you could make the XML-generation component of the xml.php a callable function which you simply include and execute.

parse.php:

<?php
  include('xml.inc');

  $doc = @simplexml_load_string(xml_function()) or die("Error");
  echo $doc->title;

xml.php:

<?php
  include('xml.inc');

  header("Content-type: text/xml");
  echo xml_function();

xml.inc:

<?php
  function xml_function() {
    $dbc = mysql... //gets data from database
    $xml = "<!DOCTYPE..."; //xml stuff here
    $xml .= "<title>" . $dataFromMySQL . "</title>";
    return $xml;
  }

But... even that seems silly, honestly, when you could have both output methods connect to the same data and skip a generation/parse step. Simply output HTML/XML conditionally.

1 Comment

Also, generating XML is not generating XML-looking strings. Use the DOM.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.