query xpath with php

I wrote following php code to extract nodes information from this xml:

<sioctBoardPost rdfabout="http//boards.ie/vbulletin/showpost.php?p=67075">
  <rdftype rdfresource="http//rdfs.org/sioc/ns#Post" />
  <dctitle>hib team</dctitle>
  <siochas_creator>
    <siocUser rdfabout="http//boards.ie/vbulletin/member.php?u=497#user">
      <rdfsseeAlso rdfresource="http//boards.ie/vbulletin/sioc.php?sioc_type=user&amp;sioc_id=497" />
    </siocUser>
  </siochas_creator>
  <dctermscreated>1998-04-25T213200Z</dctermscreated>
  <sioccontent>zero, those players that are trialing 300 -400 pingers? umm..mager lagg and even worse/</sioccontent>
</sioctBoardPost>

<?php
$xml = simplexml_load_file("boards.xml");
$products[0] = $xml->xpath("/sioctBoardPost/sioccontent");
$products[1] = $xml->xpath("/sioctBoardPost/dctermscreated");
$products[2] = $xml->xpath("/sioctBoardPost/@rdfabout");
print_r($products);
  ?>

This gives following output:

Array ( 
[0] => Array ( [0] => SimpleXMLElement Object ( [0] => zero, those players that are trialing for hib team, (hpb's) most of them are like 300 -400 pingers? umm..mager lagg and even worse when they play on uk server's i bet/ ) ) [1] => Array ( [0] => SimpleXMLElement Object ( [0] => 1998-04-25T213200Z ) ) [2] => Array ( [0] => SimpleXMLElement Object ( [@attributes] => Array ( [rdfabout] => http//boards.ie/vbulletin/showpost.php?p=67075 ) ) ) 
) 

But I need only nodes content as an output i.e without Array([0] => Array etc.

Output should be like this:

zero, those players that are trialing for hib team, (hpb's) most of them are like 300 -400 pingers? umm..mager lagg and even worse when they play on uk server's i bet

1998-04-25T213200Z

http//boards.ie/vbulletin/showpost.php?p=67075

Thanks in advance

Upvotes: 0

Views: 255

Answers (3)

Ja͢ck
Ja͢ck

Reputation: 173542

You can use current() to only get the first element of each XPath result (which is an array) and then use a (string) cast to get the node contents:

$products[0] = (string)current($xml->xpath("/sioctBoardPost/sioccontent"));
$products[1] = (string)current($xml->xpath("/sioctBoardPost/dctermscreated"));
$products[2] = (string)current($xml->xpath("/sioctBoardPost/@rdfabout"));
print_r($products);

Upvotes: 1

Ian Atkin
Ian Atkin

Reputation: 6346

This should get you what you need...

foreach ($products as $product) { // iterate through the $products array
    print $product[0]->nodeValue  // output the node value of the SimpleXMLElement Object
}

Upvotes: 0

JLRishe
JLRishe

Reputation: 101652

As you have observed, the xpath() method returns an array of matched nodes, so you need to deal with the elements of the returned arrays. I believe this should work in this case:

$xml = simplexml_load_file("boards.xml");
$products[0] = $xml->xpath("/sioctBoardPost/sioccontent")[0];
$products[1] = $xml->xpath("/sioctBoardPost/dctermscreated")[0];
$products[2] = $xml->xpath("/sioctBoardPost/@rdfabout")[0];
print_r($products);

Upvotes: 0

Related Questions