I am using the XPath in PHP 5 to parse a XML document. The problem I have is writing a foreach
to correctly display the following array:
XML document sample
value 1
value 2
$xmlfile = 'link_to_file.xml';
$xmlRaw = file_get_contents($xmlfile);
$xml = new SimpleXMLElement($xmlRaw);
$install_files = $xml->xpath('//files');
foreach($install_files as $row)
{
echo $row['file'];
}
//var_dump for $row gives the following
array(1) {
[0]=>
object(SimpleXMLElement)#21 (2) {
["file"]=>
string(12) "value 1"
["folder"]=>
string(8) "value 2"
}
}
Ideally I would like to get the value by using $row['file']
or $row['folder']
. Thanks for any help.
The items in your array are SimpleXMLElement objects. You can access their properties with the $object->property
syntax. So try this:
foreach ($array as $row) {
echo $row->folder . $row->file;
}
If I understand your example correctly,
foreach ($array as $row)
{
// do something with $row['file'] or $row['folder']
}
If you want to process only one element you don't necessarily need a loop, but it doesn't hurt either.
According to your output file
and folder
are child-elements of the element returned for your xpath query. You can access them via $parentElement->childElement
. If they were attributes you'd use $element['attributeName']
$foo = new SimpleXMLElement(getData());
foreach( $foo->xpath('row[@id="r2"]') as $row ) {
echo $row->file, " | ", $row->folder, "\n";
}
echo "-----\n";
// same thing if you have more than one element in your result set
foreach( $foo->xpath('row[@id="r2" or @id="r3"]') as $row ) {
echo $row->file, " | ", $row->folder, "\n";
}
function getData() {
return '<foo>
<row id="r1">
<file>value 1.1</file>
<folder>value 1.2</folder>
</row>
<row id="r2">
<file>value 2.1</file>
<folder>value 2.2</folder>
</row>
<row id="r3">
<file>value 3.1</file>
<folder>value 3.2</folder>
</row>
</foo>';
}
prints
value 2.1 | value 2.2
-----
value 2.1 | value 2.2
value 3.1 | value 3.2