PHP - Xml Using Php Simplexml To Change Some Xml Data Into Child Node
I am trying to use php to loop through an xml file and reorganize the data. For example, if I have a xml file about books and the first xml sub tag under the <book> tag is "<type>" . I would like to make the following tags (nodes?) as child nodes under the type tag. For example, instead of this:
Code: [Select] <book> <type>nonFiction</type> <title>Advanced PHP Programming</title> <author>George Schlossnagle</author> <publisher>Developer Library</publisher> <category>1</category> <category>3</category> </book> <book> <type>Fiction</type> <title>My Novel</title> <author>Same Nagle</author> <publisher>Developer Library</publisher> <category>1</category> <category>3</category> </book> I want to make the xml look like this: Code: [Select] <book> <type>nonFiction <title>Advanced PHP Programming</title> <author>George Schlossnagle</author> <publisher>Developer Library</publisher> <category>1</category> <category>3</category> </type> </book> <book> <type>Fiction <title>My Novel</title> <author>Same Nagle</author> <publisher>Developer Library</publisher> <category>1</category> <category>3</category> </type> </book> [attachment deleted by admin] Similar TutorialsHi, I am new to xml parsing and I just want to know how to check whether a node has attributes: Here is my xml file to use: ================= Code: [Select] <?xml version="1.0" encoding="ISO-8859-1"?> <email> <message> <to> <toFirstName>Tove</toFirstName> <toLastName toType="common" style="swag">Smith</toLastName> </to> <from> <fromFirstName>Jani</fromFirstName> <fromLastName fromType="unique">Dravison</fromLastName> </from> <heading>Reminder</heading> <body> <prologue>Tis the night before Xmas...</prologue> <paragraph1>Don't forget me this weekend!</paragraph1> <paragraph2>Jump the gun!</paragraph2> <epilogue>The end of the world.</epilogue> </body> </message> <message> <to>employees</to> <from>CEO</from> <heading>Power Lunch</heading> <body> <prologue></prologue> <paragraph1>Year over year data</paragraph1> <paragraph2>Downsizing</paragraph2> <epilogue>The end.</epilogue> </body> </message> </email> Here the simple script that I cannot get to work: ================================== Code: [Select] <?php $simpleXMLObj=simplexml_load_file("email.xml"); if($simpleXMLObj->to[0]->toLastName[0]->attributes()->getName) print "YES: this node has attributes!"; else print "NO:"; ?> Please I really need help, it is simple I know but I am new to xml parsing and mixed up. How can I print the attributes of a child node? I have been trying and looking and cant get it. I need the attributes of subfield printed after datafield so a line would look like datafield plus attributes plus subfield attributes plus subfield =906 __$a0$bcbc$corignew etc... <?php //child nodes http://www.w3schools.com/php/php_xml_dom.asp //http://books.google.com/books?id=ygQRKDEsLecC&pg=PA196&lpg=PA196&dq=print+php+xml+child+node+attributes&source=bl&ots=TCAhH4kpCt&sig=yJUPXesIkRUrNXdNE9Yr5ul7Wdw&hl=en&ei=U51kTeKQKsL48AbN4MDTBg&sa=X&oi=book_result&ct=result&resnum=10&ved=0CF4Q6AEwCQ#v=onepage&q=print%20php%20xml%20child%20node%20attributes&f=false //http://stackoverflow.com/questions/4598409/printing-content-of-a-xml-file-using-xml-dom $doc = new DOMDocument(); $doc->preserveWhiteSpace = FALSE; $doc->load( 'loc.xml' ); $root = $doc->documentElement; $type = $root->nodeType; //print $doc->nodeName."\n"; //print $root->nodeName."\n"; //print $doc->nodeValue."\n"; //print $root->nodeValue."\n"; $librecords = $doc->getElementsByTagName( "record" ); foreach( $librecords as $record ){ $leader = $record->getElementsByTagName( "leader" ); $controlfields = $record->getElementsByTagName( "controlfield" ); $datafields = $record->getElementsByTagName( "datafield" ); $subfields = $record->getElementsByTagName( "subfield" ); $leader = $leader->item(0)->nodeValue; echo '=LDR '.$leader.'<BR>'; foreach( $controlfields as $controlfield ){ $tag = $controlfield->getAttribute('tag'); $cf_value = $controlfield->firstChild->nodeValue; echo "=".$tag." ".$cf_value.'<BR>'; } foreach( $datafields as $datafield ){ $tag = $datafield->getAttribute('tag'); $ind1 = $datafield->getAttribute('ind1'); $ind2 = $datafield->getAttribute('ind2'); if ($ind1 ==" ") {$ind1 = "_";} if ($ind2 ==" ") {$ind2 = "_";} echo "=".$tag." ".$ind1.$ind2; //if($datafield->hasChildNodes()){echo 'This node has children!<br />';} foreach ($datafield->childNodes AS $item) { // $arr = $item->attributes; print $arr; print 'nodeName '.$item->nodeName . " = " . $item->nodeValue." | " ;} //. "<br />"; } // foreach ($datafield->children() as $node) { // $arr = $node->attributes(); // returns an array // print ("code=".$arr["code"]); // get the value of this attribute // print (" Company=".$node->subfield); // print ("<p><hr>"); //} // foreach( $subfields as $subfield){ // foreach($subfield->attributes as $attr){ // $attributes = $subfield->attributes; // print $attr->nodeName; // print $attr->nodeValue; // //print $attributes->nodeName; //print $attributes->nodeValue; // print $subfield->nodeName; // print $subfield->nodeValue; //}} // print $item->nodeValue ; // print $item->attributes("code"); // $valueID = $item->getAttribute('code'); // print $item->nodeName->attributes("code"); // echo $item->nodeValue.getAttribute("code"); // print $item->getAttribute('code') //http://www.devshed.com/c/a/PHP/Accessing-Attributes-and-Cloning-Nodes-with-the-DOM-XML-Extension-in-PHP-5/1/ echo '<BR>'; } foreach( $subfields as $subfield ){ $code = $subfield->getAttribute('code'); $sf_value = $subfield->firstChild->nodeValue; echo '$'.$code.$sf_value.'<BR>'; } echo '<BR>'; } ?> Code: [Select] <leader>01026ngm a22002773a 4500</leader> <controlfield tag="001">16429180</controlfield> <controlfield tag="005">20100823131409.0</controlfield> <controlfield tag="007">vffcjaho|</controlfield> <controlfield tag="008">100823s2010 xxu060 mleng </controlfield> <datafield tag="906" ind1=" " ind2=" "> <subfield code="a">0</subfield> <subfield code="b">cbc</subfield> <subfield code="c">orignew</subfield> <subfield code="d">u</subfield> <subfield code="e">ncip</subfield> <subfield code="f">20</subfield> <subfield code="g">y-movingim</subfield> </datafield> <datafield tag="955" ind1=" " ind2=" "> <subfield code="b">qm12 2010-08-23</subfield> </datafield> Hey, Having some troubles extracting data from simpleXML object. var_dump outputs all the stuff correctly but when i try access data in the object, it just comes back empty. $rss = "/data/rss/"; $rss = file_get_contents($rss); // simplexml_load_file() fails $feed = new SimpleXMLElement($rss); foreach($feed->item as $news) { echo $news->title; // returns empty } echo $feed->item->title; // also is empty so var_dump($feed) outputs this, shortened version: object(SimpleXMLElement)#10 (2) { ["@attributes"]=> array(1) { ["version"]=> string(3) "2.0" } ["channel"]=> object(SimpleXMLElement)#11 (6) { ["title"]=> string(38) "Bradford Bulls Super League Rugby News" ["description"]=> string(75) "RSS Feed for the latest Bradford Bulls Super League rugby news and updates." ["link"]=> string(46) "http://www.superleaguefans.com/bradford-bulls/" ["language"]=> string(2) "en" ["pubDate"]=> string(26) "Sat, 03 Sep 13:42:39 +0100" ["item"]=> array(10){ [0]=> object(SimpleXMLElement)#12 (1) { ["title"]=> string(32) "Briggs and Walker in Bulls squad" } } } } so, $feed->item->title should return the ["title"] contents, but it doesn't, driving me crazy. what am i doing wrong? Any pointers will be much appreciated, thank you. good evening dear php-freaks,
hope you are all right.
My tactic is as follows:
1. i run requests to the openstreetmap-endpoint- (see below) and i try three different APIs per request isn't that easy on ressources and 2. I don't know how to work with the results that i gather from the OpenStreetmap-Endpoint
as of the first point: - workin on the endpoint of OSM-Overpass-API.... see my approach: <?php /** * OSM Overpass API with PHP SimpleXML / XPath * * PHP Version: 5.4 - Can be back-ported to 5.3 by using 5.3 Array-Syntax (not PHP 5.4's square brackets) */ // // 1.) Query an OSM Overpass API Endpoint // $query = 'node ["amenity"~".*"] (38.415938460513274,16.06338500976562,39.52205163048525,17.51220703125); out;'; $context = stream_context_create(['http' => [ 'method' => 'POST', 'header' => ['Content-Type: application/x-www-form-urlencoded'], 'content' => 'data=' . urlencode($query), ]]); # please do not stress this service, this example is for demonstration purposes only. $endpoint = 'http://overpass-api.de/api/interpreter'; libxml_set_streams_context($context); $start = microtime(true); $result = simplexml_load_file($endpoint); printf("Query returned %2\$d node(s) and took %1\$.5f seconds.\n\n", microtime(true) - $start, count($result->node)); // // 2.) Work with the XML Result //
so far so good: with this i get a bunch of data.....
<?xml version="1.0" encoding="UTF-8"?> <osm version="0.6" generator="Osmosis SNAPSHOT-r26564" xapi:planetDate="2014-10-07T15:42:02Z" xmlns:xapi="http://jxapi.openstreetmap.org/"> <node id="251652819" version="6" timestamp="2013-10-19T14:03:10Z" uid="1198089" user="GeorgeKaplan" changeset="18434238" lat="48.8527413" lon="2.3333559"> <tag k="dispensing" v="yes"/> <tag k="website" v="http://www.pharmacie-paris-citypharma.fr/"/> <tag k="name" v="Pharmacie Citypharma in downtown paris"/> <tag k="amenity" v="pharmacy"/> </node> <node id="251774849" version="9" timestamp="2014-07-28T21:28:26Z" uid="92075" user="Art Penteur" changeset="24411346" lat="48.8468043" lon="2.3696423"> <tag k="phone" v="0143430996"/> <tag k="dispensing" v="yes"/> <tag k="name" v="Pharmacie de la Rapée in downtown paris"/> <tag k="amenity" v="pharmacy"/> <tag k="opening_hours" v="Mo-Fr 08:30-20:30; Sa 09:00-19:30"/> </node> <node id="263262912" version="3" timestamp="2014-07-28T21:37:24Z" uid="92075" user="Art Penteur" changeset="24411346" lat="48.8446917" lon="2.3101829"> <tag k="dispensing" v="yes"/> <tag k="amenity" v="pharmacy"/> </node>
what is aimed: I am trying to filter the records based on the attributes that i find in the dataset, <tag k="name" v="blahblahblah"/> field.
I have been looking around and the classical way to do it its easy, however because of my poor skills in doing anything Is it possible to apply xml filtering for tags that look like this <tag k="dispensing" v="yes"/> ones that do not have the <tag></tag>
.....format. Also how can i filter the records when each child of the node has different attributes,like v, <tag k="name">Pharmacie in Paris-downtown - Rapée-metro-station</tag>
i have had a quick look at the PHP-SimpleXML and the XPath-approach: it may help me in achieving what is aimed.
but at the moment - i think i got stuck.
i greatly appreciated hints and some ideas that may fit her.
have a great day. - yours dil_bert Edited December 1, 2019 by dil_bert Hi, I have an XML Feed which is using ID's or Types. I need to select the specific node and convert it to a variable. Example XML Feed: Code: [Select] <tour> <tourName>Amazon Riverboat Adventure</tourName> <dossierCode>PVIIA</dossierCode> <tripDetails> <tripDetail type="StartFinish">ex Lima</tripDetail> <tripDetail type="What's Included">Lots of stuff </tripDetail> </tripDetails> I have been extracting this data by using: <?php if(!$xml=simplexml_load_file('xmlfeed.xml')){ trigger_error('Error reading XML file',E_USER_ERROR); } foreach ($xml->tourName as $tourname) foreach ($xml->dossierCode as $agentcode) ?> However I am unsure how I can extract the "ex lima" from StartFinish as $startfinish. Can anyone help? Many thanks! good day dear phpfreaks.
I am new to PHP's SimpleXML. i want to work with SimpleXML on OSM-files. The original version of this question was derived from he OSM Data parsing to get the nodes with child https://stackoverflow.com/questions/16129184/osm-data-parsing-to-get-the-nodes-with-child
I am thankful that hakre offered a great example in the comments that makes a overwhelming goal: how to get more out of it: I want to filter the data to get the nodes with special category. Here is sample of the OSM data I want to get the whole schools within an area. The first script runs well - but now I want to refine the search and add more tags. Finally I want to store all into MySQL. So we need to make some XML parsing with PHP:
The following is a little OSM Overp
Quote
since i am learning - i break down the code into pieces...For my question, the second part is more interesting here. That is querying the XML data we have already. Again - as mentioned above: This is most easily done with xpath, the used PHP XML library is based on libxml which supports XPath 1.0 which covers the various querying needs very well. The following example lists all schools and tries to obtain their names as well.
# get all school nodes with xpath //node[tag[@k = "amenity" and @v = "school"]] This line says: Give me all node elements that have a tag element inside which has the k attribute value "amenity" and the v attribute value "school". Explanation: This is the condition we have to filter out those nodes that are tagged with amenity school. Further on xpath is used again - a second time: now relative to those school nodes to see if there is a name and if so to fetch it: Therefore we use the foreach-syntax:
foreach ($schools as $index => $school)
tag[@k = "name"]/@v'
tag[@k = "name"]/@v' Because not all school nodes have a name, a default string is provided for display purposes by adding it to the (then empty) result array:
list($name) = $school->xpath('tag[@k = "name"]/@v') + ['(unnamed)'];
Query returned 907 node(s) and took 1.10735 seconds. goal: to get out even more important data - see here Key:contact - OpenStreetMap Wiki
Well - we are already extracting the name: If we want to have more data then we just have to run a few more xpath queries inside our loop for all the address keys and the website. So - additionally: we do not have to forget to look for the website key additional to contact:website. cf: https://wiki.openstreetmap.org/wiki/Key:website conclusio: well - i think that i need to extend the xpath requests within the loop where xpath is used again, now relative to those school nodes to see if there is a name and if so to fetch it:
tag[@k = "name"]/@v' i did some further tess and found out very interesting things
$query = 'node
$context = stream_context_create(['http' => [
# please do not stress this service, this example is for demonstration purposes only.
$result = simplexml_load_file($endpoint);
//
# get all school nodes with xpath
$query = 'node
$context = stream_context_create(['http' => [
$endpoint = 'http://overpass-api.de/api/interpreter';
$result = simplexml_load_file($endpoint);
me/martin/dev/php/o1.php on line 68
33 School(s) found:
so far so good : if i add some lines in the part 2 i run into errors... -see below: i want to get more data out of it: - and coded like so;
{ note - within the part 2 that works with the XML-Result.
//
# get all school nodes with xpath
contact:phone I will dig into all documents and come back later the weekend... and report all the findings well - i think that i need to extend the xpath requests within the loop where xpath is used again, now relative to those school nodes to see if there is a name and if so to fetch it:
tag[@k = "name"]/@v'
more infos I have a major problem; I have two tables - Category and Product The catID is the primary key for Category and acts as the foreign key for Product. I have some example data below; CATEGORY catID: 3 cat: Pink PRODUCT prodID: 1 product: Fuchsia catID: 3 prodID: 2 product: Dark Pink catID: 3 what I want is the page to display the data like this? Header: Pink Content: Fuchsia Dark Pink Below is the code thus far; Code: [Select] <?php error_reporting(E_ALL ^ E_NOTICE); ini_set("display_errors", 1); require ('includes/config.inc.php'); include ('./includes/header.html'); require (MYSQL); include ('./includes/main.html'); if($id = isset($_GET['catID'])) { $q = ('SELECT `category`.`catID` , `category`.`cat` , `product`.`product` FROM `product` LEFT JOIN `hairext`.`category` ON `product`.`catID` = `category`.`catID` WHERE `product`.`catID`="'.$_GET['catID'].'"'); $r = mysqli_query($dbc, $q); echo '<div id="right">'; $num = mysqli_num_rows($r); for ($j = 0 ; $j < $num ; ++$j) { $row = mysqli_fetch_row($r); echo '<h1>' . $row[1] . '</h1>'; } while($row = mysqli_fetch_array($r)) { echo '<p>'; echo $row[2]; echo "<br />"; echo '</p>'; } echo '</div>'; } include ('./includes/footer.html'); ?> At the moment, this is not doing what I want, I apologise if this is very long winded, but how do I solve this problem please? Hi I am trying to create a hierarchy array from our mysql database. What i have so far is: //instantiate DB & connect $database = new Database(); $db = $database->connect(); //instantiate question object $question = new Question($db); //query $results = $question->read(); //check for data if ($results) { $question_arr['questions'] = array(); $child_arr = array(); while ($row = $results->fetch(PDO::FETCH_ASSOC)) { array_push($question_arr['questions'], $row); $question_arr['questions'][] = buildTree($row); } print_r($question_arr['questions']); } else { echo json_encode(array('message'=>'nothing here!.')); } function buildTree($child) { $branch = array(); foreach ($child as $row) { $childresults = $question->read_children($row['parentid']); while ($childrow =$childresults->fetch(PDO::FETCH_ASSOC)) { $children = buildTree($childrow); if ($children) { $row['children'] = $children; } $branch[] = $childrow; } } //} return $branch; } in my Questions.php file: <?php class Question{ private $conn; public $id; public $childid; public $parentid; public $question; public $pageid; public $numclicks; public $typeid; public $date_created; // Constructor with DB public function __construct($db) { $this->conn = $db; } public function read() { //create query(sql statement) $query = 'SELECT id as parentid, question, pageid, typeid,numclicks,date_created from ct_questions'; // Prepare statement $stmt =$this->conn->prepare($query); // Execute query $stmt->execute(); return $stmt; } public function read_children($parentid) { //This is from a View I created in Mysql $query = 'SELECT parent_question, parentid, parent_pageid, child_question, childid, child_pageid from ct_vquestion_parent_child_lookup where parentid='.$parentid.''; // Prepare statement $stmt = $this->conn->prepare($query); // Execute query $stmt->execute(); return $stmt; } }
the current errors i am getting a <br /> <b>Notice</b>: Undefined variable: question in <b>C:\htdocs\api\questions\read.php</b> on line <b>41</b><br /> <br /> <b>Fatal error</b>: Uncaught Error: Call to a member function read_children() on null in C:\htdocs\api\questions\read.php:41 Stack trace: #0 C:\htdocs\api\questions\read.php(28): buildTree(Array) #1 {main} thrown in <b>C:\htdocs\api\questions\read.php</b> on line <b>41</b><br /> Hi I try to build a login form in which the user enter its userid, and the system check in the database for the user name and present it There are several other fiels that should act the same way. the problem is that the description field not get the user name. I be glad if someone show me where is the problem here is the code i use: The index.php page <!DOCTYPE html> <!-- To change this license header, choose License Headers in Project Properties. To change this template file, choose Tools | Templates and open the template in the editor. --> <?php require_once(".Includes/GlDbOra.php"); $logonSuccess = false; //get user details if (isset($_POST['userid_typed'])) { $row = (DBOracle::getInstance()->get_user_details1($_POST['userid'])); if(!$row) { echo "The user code entered in invalid"; } else { ?> <input type="text" name="userid_desc" id="user_desc" class="regular_textbox" value=<?php echo $row('username'); ?> readonly="readonly" disabled="disabled" /> <?php } } ?> <html> <head> <meta charset="UTF-8"> <title>Login</title> <script type="text/javascript" src="../../php-ajax/jquery-3.5.1.js"></script> <link href="index.css" type="text/css" rel="stylesheet" madia="all"/> </head> <body> <div class="logon"> <form name="logon" id="logon" action="index.php" method="POST" > <span style="clear: both; float: left; margin-top: 20px; "> <label for="userid">User Id</label> <input type="text" name="userid" id="userid" class="left_radius_textbox" placeholder="<?php echo userid;?>"/> <input type="text" name="userid_desc" id="user_desc" class="regular_textbox" value="" readonly="readonly" disabled="disabled" /> <label for="password">Password</label> <input type="password" name="password" id="password" class="regular_textbox" placeholder="<?php echo password;?>"/> </span> <span style="clear: both; float: left; margin-top: 20px"> <label for="compid">Company</label> <input type="text" name="compid" id="compid" class="left_radius_textbox" placeholder="<?php echo compid;?>"/> <input type="text" name="compid_desc" id="compid_desc" class="regular_textbox" value="" readonly="readonly" disabled="disabled" /> <label for="language">Language</label> <input type="text" name="language" id="language" class="left_radius_textbox" placeholder="<?php echo language;?>"/> <input type="text" name="language_desc" id="language_desc" class="regular_textbox" value="" readonly="readonly" disabled="disabled" /> </span> <span style="clear: both; float: right; margin-top: 20px"> <input type="submit" value="Login"style="margin-right: 500px; border-radius: 40px ; text-align:center;width: 220px; height: 30px;" class="" placeholder="<?php echo login;?>"/> </span> </form> </div> <script> $(document).ready() { $("#userid").focusout() { var userid=$('input[name=userid]').val(); $.ajax ({ type:"POST", url:"../AmiDorGL/Includes/GlDbOra.php", data: { "userid_typed":1, "userid":userid, }, datatype:"text", success:function(response) { $("#userid_desc").html(response); } }); }; }; </script> </body> </html> the GlDbOra.php code: <?php /* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */ class DBOracle { private static $instance = null; private $OracleUser="xxx"; private $OraclePwd="xxx"; private $OracleDB="xxx"; public static function getInstance() { if (!self::$instance instanceof self) { self::$instance = new self; } return self::$instance; } // The clone and wakeup methods prevents external instantiation of copies of the Singleton class, // thus eliminating the possibility of duplicate objects. public function __clone() { trigger_error('Clone is not allowed.', E_USER_ERROR); } public function __wakeup() { trigger_error('Deserializing is not allowed.', E_USER_ERROR); } public function __construct () { $this->con = oci_connect($this->OracleUser, $this->OraclePwd, $this->OracleDB); if (!$this->con) { $m = oci_error(); echo $m['message'], "\n"; exit; } } public function get_user_details1($userid) { $query = "select first_name||' '||last_name username, password from users where userid = :userid_bv"; $stid = oci_parse($this->con, $query); oci_bind_by_name($stid, ':userid_bv', $userid); oci_execute($stid); $row = oci_fetch_array($stid, OCI_ASSOC); return $row; } }
Edited May 29, 2020 by requinix please use the Code <> button when posting code Hello I have xml like this. <?xml version="1.0" encoding="utf-8"?> <data> <item ID="30001"> <Company>Navarro Corp.</Company> </item> <item ID="30002"> <Company>Performant Systems</Company> </item> <item ID="30003"> <Company>Digital Showcase</Company> </item> </data> All i need to do is get any one of the whole node from starting item tag to ending item tag from the xml, for example. getting <item ID="30002"> <Company>Performant Systems</Company> </item> from whole xml file. Can this be achieved using SimpleXML object from PHP? if not how it can be done. Thanks in advance watsmyname Can someone please explain to me what's the importance of node order? Does certain nodes that appear first or last have impact on traversing time? Any suggestions much appreciated! How do I update an xml node? Currently I have this: $xml = simplexml_load_file($xmlfile); $user = $xml->xpath('/root/users/user/name'); $usr = $user[0][0]->asXML(); $usr = $name; I don't know if that I right or not, but I do know that if it is right, it isn't updating the xml file. Am I on the right track, or not? What can I do? I'm trying to delete the <identifier> node of some XML, using the following code; unsuccessfully.
Can someone help me identify where I'm going wrong? TIA
$newXML = ""; $xmlString = Fedora_API::callGetDatastreamContents($this->pid, 'MODS', true); $doc = DOMDocument::loadXML($xmlString); $xpath = new DOMXPath($doc); $fieldNodeList = $xpath->query("/identifier"); foreach ($fieldNodeList as $node) { $fieldNodeList->removeChild($node); } $newXML = $doc->SaveXML(); I'm trying to add/update an xml like so: $xml->Header->Record->$curblk->$row = $value; where $curblk and $row are obviously nodes. Problem is that sometimes I need to add/update nodes of the same name so I tried this: $xml->Header->Record->$curblk->$row[$multi] = $value; where $multi would represent the number (or instance or key?) of that node I wish to add/update. Issue with that is, php thinks that I'm tring to set the node as an array, which is not possible! So how do I dynamically add/update $row[0] , $row[1] , $row[2] base on the two variable, $row and $multi? ie: $row = Jim Bob; $multi = 0; <author>Jim Bob</author> $row = Tom Reed; $multi = 1; <author>Tom Reed</author> You get: <book> <author>Jim Bob</author> <author>Tom Reed</author> </book>Of course there is muuuuch more to it than that, but that is about as simple as I can explain it... Of course thank you for any help, i've been stuck on this for 3 days now! and my boss is not happy, especially since I'm a vary novice developer that took on this assignment... Hi All, I've been struggling to get the following code to work. I have an API feed that looks like this:
<Jobs> <Job> <ID>1805</ID> <Name>House Additions/Alterations </Name> <Description>House</Description> <Client> <ID>16178470</ID> <Name>client name 1</Name> </Client> <ClientOrderNumber></ClientOrderNumber> <State>In Construction</State> <StartDate>2018-03-26T00:00:00</StartDate> <DueDate>2020-03-31T00:00:00</DueDate> <Contact> <ID>10195532</ID> <Name>Clent Name1</Name> </Contact> <InternalID>25026686</InternalID> <Manager> <ID>610781</ID> <Name>Manager Name 1</Name> </Manager> <Partner> <ID>610781</ID> <Name>patner name</Name> </Partner> <Assigned> <Staff> <ID>610781</ID> <Name>Staff 1</Name> </Staff> ......... I'm trying to work out how to show all the job ID, Job Name, Client Name, Start Date etc that are specific to the assigned staff member by selecting a specific staff member. $Staff is populated by a dropdown earlier in the code. here's my code so far: if ($err) { echo "cURL Error #:" . $err; } else { $xml=simplexml_load_string($response) or die("Error: Cannot create object"); $jobs = $xml->xpath("Jobs/Job/Assigned/Staff[Name= '$Staff']"); foreach($jobs as $item) { //foreach($xml->Jobs->Job as $item) { $item1 = $item->Client->Name; $job_no = "$item->ID"; $job_name = "$item->Name"; $job_client = "$item1"; $job_start = "$item->StartDate"; $job_due = "$item->DueDate"; $job_status = "$item->State"; echo "<tr><td>$job_no</td><td><a href='activecp/managejob.php?job_id=$job_no'>$job_name</a></td><td>$job_client</td><td>$job_status</td><td>$job_start</td><td>$job_due</td></tr>"; } } This currently shows the ID and name of the selected staff member but not the info i need. All of the data I want to show is before the Assigned/Staff . Any help would be much appreciated. Thanks in advance. XML file:
<?xml version="1.0" ... > <database xmlns:xsi="http://www.w3.org/20...hema-instance"> <record> <id>1</id> <name></name> </record> <record> ... </record> </database> I want to delete the record where <id> equals $_GET['id']. I tried many suggested implementations based on xml or simplexml, without result. Came across a very simple workaround (it should omit the record where id=$id), but can someone help me to taylor it to my xml scheme? <?php $file = "database.xml"; $id = $_GET['id']; echo "DELETING: ".$id; $xml = simplexml_load_file($file); $str = "<?xml version=\"1.0\"?> <database>"; foreach($xml->children() as $child){ if($child->getName() == "id") { if($id == $child['name']) { continue; } else { $str = $str.$child->asXML(); } } } $str = $str." </database>"; echo $str; $xml->asXML("database_backup.xml"); $fh = fopen($file, 'w') or die("can't open file"); fwrite($fh, $str); fclose($fh); ?> I am creating a football predictor game and have a table in the database to hod all my users i have written a query to pull all out the users that have made a prediction that day with their predictions made i have put this into an array so my array will hold all the user details 1 being their userId I have set the order by on the query to userId so I get all the same users predictions in 1 block. I now want to extract all the predictions for each user and put these into their own array but I don't know which users the array will hold, how many users their will be, or how many predictions each user would have made so i'm not sure how to create this array i'm quite new to php can anyone help me with this Hi, I have a RSS feed cached as an XML file. I need to pull some info out of it so I can then print it to the page. Currently I am using this code to extract the data: $doc = new DOMDocument(); $doc->load('inthenews.xml'); $inthenews = array(); foreach ($doc->getElementsByTagName('item') as $node) { $itemRSS = array ( 'title' => $node->getElementsByTagName('title')->item(0)->nodeValue, 'link' => $node->getElementsByTagName('link')->item(0)->nodeValue, 'desc' => $node->getElementsByTagName('description')->item(0)->nodeValue, ); array_push($inthenews, $itemRSS); } However, the Description node contains more than I want. I need to remove everything except for the image ( <img../> ) it contains. Is there some way of running preg or similar on the nodeValue as it is extracted? Or an alternative to "getElementsByTagName" that allows searching for strings? If not, does anyone have a suggestion for doing this? I tried running preg_replace on the array, but it doesn't seem to do anything?? An example of the Array created by my code above is shown below: Code: [Select] [0] => Array ( [title] => BBC radio Cambridge 7.20am [link] => images/news/Matthew_Freeman_Radio_Cambridgeshire_21-10-10.mp3 [desc] => <img alt="BBC-logo" src="http://www2.mrc-lmb.cam.ac.uk/images/news/BBC-logo.jpg" height="54" width="127" /><br/>BBC radio Cambridge 7.20am 21.10.10: Dr Matthew Freeman"<br/> 21 October 2010 ) Thanks in advance for any advice Phil I would like to adding a node to a tree. I want it to be a balanced b-tree. The logic/algorithm i can think of is Code: [Select] <?php function add_node($root, $node) // Where $root is the parent to which node should be added and $node is the node that is to be added. { Traverse the tree level wise, level 1 being the lchild and rchild of $root and calculate the number of node in that level if(number of nodes in a level < 2[sup]$level[/sup]) // Since number of nodes a level can accommodate = 2[sup]$level[/sup] { Add node in that level where ever it gets an empty spot. } } ?> Tree table:- Code: [Select] CREATE TABLE IF NOT EXISTS `tree` ( `parent` int(7) NOT NULL, `rchild` int(7) NOT NULL, `lchild` int(7) NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1; Is their any better logic to do so ? Hi, I need to build my own xml validator and was wondering, what are some possible purposes of having multiple text nodes for a given parent node, I ask b/c while I was playing around with W3schools XML validator, I noticed it successfully validated the following: <?xml version="1.0" encoding="utf-8" ?> <note> <to>Joh</to> <from>Frank</from> <body>Hello world</body> Extra text node that is validated! </note> |