this is my general.xml file:-
<?xml version="1.0" encoding="UTF-8"?>
<results>
<numFound>10</numFound>
<QTime>4</QTime>
<result>
<distance>1071.59873299109</distance>
<name>Irungattukottai</name>
</result>
<result>
<distance>1892.33578431928</distance>
<name>Valapuram</name>
</result>
</results>
region.xml:-
<childrens>
<child_5068 entity_id="5069" value="Irungattukottai" parent_id="4068"/>
<child_5068 entity_id="7140" value="Valapuram" parent_id="4068"/>
</childrens>
product.xml:-
<products>
<product_id value="1">
<tab_id value="351">
<tab_name value="test1"/>
<dist_region value="5069"/>
<dist_region value="5069"/>
<dist_region value="5069"/>
</tab_id>
</product_id>
<product_id value="2">
<tab_id value="352">
<tab_name value="test2"/>
<dist_region value="4457"/>
<dist_region value="7140"/>
<dist_region value="5069"/>
</tab_id>
</product_id>
</products>
i have this three xml file i want to try something like this.
in general.xml file element <name>Irungattukottai</name>
if this name is exit in region.xml
then get there entity_id
if entity_id is exit in product.xml
then return there product_id
element attribute value...
i am try this code:-
<?php
$g = file_get_contents('general.xml');
$r = file_get_contents('region.xml');
$p = file_get_contents('product.xml');
$general = simplexml_load_string($g);
$region = simplexml_load_string($r);
$product = simplexml_load_string($p);
$name = (string)$general->result->name;
if (strlen(trim($name))==0) exit('name not found');
list($entity) = $region->xpath("//*[@value='$name']/@entity_id");
$entity=(string)$entity;
if (strlen(trim($entity))==0) exit('entity_id not found');
list($prid) = $product->xpath("//dist_region[@value='$entity']/ancestor::product_id/@value");
$prid=(string)$prid;
echo "City Name:- $name, Entity_id:- $entity, Product_id:- $prid";
?>
this code is work perfact but only one value eg:-general.xml
has two root in first <name>Irungattukottai</name>
and in second root<name>Valapuram</name>
but my code is work only get first element not try to get wall xml file...
this is my corrent output:-
city Name:- Irungattukottai, Entity_id:- 5079, Product_id:- 1
but i want to this type of output:-
city Name:- Irungattukottai, Entity_id:- 5079, Product_id:- 1
city Name:- Valapuram , Entity_id:- 7140, Product_id:- 2
with use of above both answer its possible try this:-
<?php
foreach($general->result as $row){
if(isset($row->name)){
//create one variable and store in value.
$name = $row->name;
//all you code for region.xml and then for product.xml
}
echo "name:- $name,Entity:- $entity, product:- $prid"."<br>";
}
?>
You need to iterate the array of $general.
Try to do :
echo '<pre>';
print_r($general);
echo '</pre>';
Check if you get an array with all the elements as in the xml file.
Your code to get general.xml feeds is ok.
You can get the name as
$name1 = (string)$general->result[0]->name;
$name2 = (string)$general->result[1]->name;
or you can use loop to get name one by one.
<?php
foreach($general->result as $row){
if(isset($row->name)){
// do your logic here for region.xml and then for product.xml
}
}
?>
Try this:
$xml = simplexml_load_file( 'general.xml' );
$cities = $xml->xpath( '//result/name' );
$cityCount = count( $cities );
if( $cityCount ) {
$region = simplexml_load_file( 'region.xml' );
foreach( $cities as $city ) {
$regions = $region->xpath( '//*[@value="'. ( string ) $city . '"]/@entity_id' );
if( count ( $regions ) ) {
$product = simplexml_load_file( 'products.xml' );
$products = $product->xpath( '//dist_region[@value="' . ( string ) $regions[ 0 ][ 'entity_id' ] . '"]/ancestor::product_id/@value' );
if( count( $products ) ) {
foreach( $products as $p ) {
echo 'city Name:- ' . ( string ) $city . ', Entity_id:- ' . ( string ) $regions[ 0 ][ 'entity_id' ] . ', Product_id:- ' . $p[ 'value' ] . "
";
}
}
}
}
}
Output
city Name:- Irungattukottai, Entity_id:- 5069, Product_id:- 1
city Name:- Irungattukottai, Entity_id:- 5069, Product_id:- 2
city Name:- Valapuram, Entity_id:- 7140, Product_id:- 2