Link to home
Start Free TrialLog in
Avatar of trevor1940
trevor1940

asked on

PHP: Parsing XML file

Hi
I'm attempting to pass an XML file

    $xml = simplexml_load_file('test.xml');
 
   var_dump($xml);

Open in new window


Produces

\\Path\To\test.php
object(SimpleXMLElement)[1]
  public 'title' => string "My Title" (length=8)
 ........
public  'properties ' =>
           array (size=1234)
                  0=>
                    object(SimpleXMLElement)[2]
                  2=>
                    object(SimpleXMLElement)[2]
                  3=>
                    object(SimpleXMLElement)[4]

Open in new window


Before some one asks I cannot upload the xml file but it looks like this (There might be errors due to fat fingers)

<?xml version="1.0" encoding="UTF-8" ?>
<resultset  xmlns="http://example.com/" xmlns:ns2="http://example.com/path/to/file" xmlns:ns2="http://example.com/path/to/other/file">
  <title>The Searchers</title>
  <date>1956</date>
  <properties >
    <ns2:name>overview</ns2:name>
    <ns2:value  xmlns:xs="http://www.w3.org/2001/XMLSchema"  xsi:type="xs:string">As a Civil War veteran spends years searching for a young niece captured by Indians, his motivation becomes increasingly questionable.</ns2:value>
  </properties >
  <properties >
    <ns2:name>Director</ns2:name>
    <ns2:value  xmlns:xs="http://www.w3.org/2001/XMLSchema"  xsi:type="xs:string">John Ford</ns2:value>
  </properties >
  <properties >
    <ns2:name>actors</ns2:name>
    <ns2:value xmlns:xsi="http://example.com/XMLSchema" xsi:type="ns2:list">
       <ns2:entries xmlns:xs="http://www.w3.org/2001/XMLSchema"  xsi:type="xs:string">John Wayne</ns2:entries>
       <ns2:entries xmlns:xs="http://www.w3.org/2001/XMLSchema"  xsi:type="xs:string">Jeffrey Hunter</ns2:entries>
       <ns2:entries xmlns:xs="http://www.w3.org/2001/XMLSchema"  xsi:type="xs:string">Vera Miles</ns2:entries>
       <ns2:entries xmlns:xs="http://www.w3.org/2001/XMLSchema"  xsi:type="xs:string">Natalie Wood</ns2:entries>
</ns2:value>
  </properties >
 <filmData>
    <location>Monument Valley</location>
     <imdb>https://www.imdb.com/title/tt0049730/</imdb>
 <filmData>
</resultset>';

Open in new window


Could someone suggest how to get the value of  title and how to loop through the "Properties Array"  accessing the elements of   object(SimpleXMLElement)[2] (In the XML these are Name Value pears that don't show up in the var_dump also the parts of filmData?
Avatar of Julian Hansen
Julian Hansen
Flag of South Africa image

The title
$title = (string)$xml->title;

Open in new window

The properties. But there is a watch-it here - the third entry has an array of entries so you would need to account for that in your output

foreach($xml->properties as $r) {
  echo "Name: " . $r->name . "<br>";
  echo "Value:" . $r->value . "<br>";
}

Open in new window

Avatar of trevor1940
trevor1940

ASKER

The title works but

foreach($xml->properties as $r) {
  echo "Name: " . $r->name . "<br>";
  echo "Value:" . $r->value . "<br>";
}

Open in new window


Gives
Name:
Value:
Name:
Value:

Open in new window


I'm assuming I can get above to work I'll need do something like

foreach($xml->properties as $r) {
  $name = $r->name;
  if($name == "actors"){
    // process as array??
}
else{
  echo "Name: " . $name . "<br>";
  echo "Value:" . $r->value . "<br>";
  }
}

Open in new window

It would depend on your data - I had to work on a modified version of the xml you posted as it did not work as presented.

You can also try casting your values to strings (string)$r->name.

As for accessing the entries - you can just check if it exists and then do
$xml = simplexml_load_file('t3400.xml');
$title = $xml->title;
echo $title;
echo "<pre>";
foreach($xml->properties as $r) {
	echo "Name: " . $r->name . "\n";

	if (isset($r->value->entries)) {
		foreach($r->value->entries as $p) {
			echo "A: {$p}\n";
		}
	}
	else {
		echo "Value:" . $r->value . "\n";
	}
}
echo "</pre>";

Open in new window

Using XML
<?xml version="1.0" encoding="UTF-8" ?>
<resultset  xmlns:xs="http://example.com/" xmlns:ns2="http://example.com/path/to/other/file">
  <title>The Searchers</title>
  <date>1956</date>
  <properties>
    <name>overview</name>
    <value>As a Civil War veteran spends years searching for a young niece captured by Indians, his motivation becomes increasingly questionable.</value>
  </properties>
  <properties >
    <name>Director</name>
    <value>John Ford</value>
  </properties >
  <properties>
    <name>actors</name>
    <value>
       <entries xmlns:xsi="http://www.w3.org/2001/XMLSchema"  xsi:type="xs:string">John Wayne</entries>
       <entries xmlns:xsi="http://www.w3.org/2001/XMLSchema"  xsi:type="xs:string">Jeffrey Hunter</entries>
       <entries xmlns:xsi="http://www.w3.org/2001/XMLSchema"  xsi:type="xs:string">Vera Miles</entries>
       <entries xmlns:xsi="http://www.w3.org/2001/XMLSchema"  xsi:type="xs:string">Natalie Wood</entries>
</value>
  </properties >
 <filmData>
    <location>Monument Valley</location>
     <imdb>https://www.imdb.com/title/tt0049730/</imdb>
 </filmData>
</resultset>

Open in new window

Produces
The Searchers

Name: overview
Value:As a Civil War veteran spends years searching for a young niece captured by Indians, his motivation becomes increasingly questionable.
Name: Director
Value:John Ford
Name: actors
A: John Wayne
A: Jeffrey Hunter
A: Vera Miles
A: Natalie Wood

Open in new window

I wish I was able to show  you a real example but It's just not possible
 
$name =  (string)$r->name;

Open in new window


Still doesn't reveal anything

Doing something like A perl script i've  written in the past just errors
 
$name =  (string)$r->ns2:name; 

Open in new window



This isn't the way to do it I'm sure but by reading the XML in using file_get_contents
Then use str_replace to remove "ns2:"
Then process the string with $xml = simplexml_load_string($xml);

I can then access the name value pares  as shown
What does this produce

echo "<pre>" . print_r($xml, true) . "</pre>";

Open in new window


Can we at least see what the dump looks like to see how data is stored internally.
ASKER CERTIFIED SOLUTION
Avatar of Julian Hansen
Julian Hansen
Flag of South Africa image

Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial
Hi
Not sure about last comment

Will try when I'm back in the office