Tek-Tips is the largest IT community on the Internet today!

Members share and learn making Tek-Tips Forums the best source of peer-reviewed technical information on the Internet!

  • Congratulations Westi on being selected by the Tek-Tips community for having the most helpful posts in the forums last week. Way to Go!

Parsing xml data files

Status
Not open for further replies.

tewari68

Programmer
Jan 25, 2005
87
US
Hi,
I have written a php routine which parses a xml file and puts the data in the database the script goes into a certain folder looks for .xml files and then parses them one by one and does the database entry.
I have written this code so far however I am not able to get the right sql queries .
Each xml file will have one order id and several images associated with that orderid and there maybe several such xml files. Now for each orderid I have to insert the order id and imagenames and other data into the database.
HERE IS MY CODE.
Code:
<?php
include("/home/caskie/[URL unfurl="true"]www/demos/laserlight/includes/global_vars.php");[/URL]
require_once("/home/caskie/[URL unfurl="true"]www/demos/laserlight/includes/cls_db.php");[/URL]
$db=new db(_DB_HOST_,_DB_NAME_,_DB_USER_NAME_,_DB_USER_PASSWORD_,true);
                $db->db_connect();
                $db->db_select_db();

$newDirectory = "/home/caskie/[URL unfurl="true"]www/demos/laserlight/samples/php/photo/";[/URL]

$xml_orderid_key = "*ORDER*ORDERID";
$xml_ordernumber_key = "*ORDER*ORDERNUMBER";
$xml_custname_key = "*ORDER*CUSTOMER*NAME";
$xml_qty_key = "*ORDER*ITEMS*ITEM*QUANTITY";
$xml_img_key = "*ORDER*ITEMS*ITEM*IMAGES*IMAGE*NAME";
$xml_retailsku_key = "*ORDER*ITEMS*ITEM*PRODUCT*RETAILSKU";
$xml_coaddress1_key = "*ORDER*SHIPTOADDRESS*LINE1";
$xml_coaddress2_key = "*ORDER*SHIPTOADDRESS*LINE2";
$xml_cocity_key = "*ORDER*SHIPTOADDRESS*CITY";
$xml_costate_key = "*ORDER*SHIPTOADDRESS*STATE";
$xml_cozipcode_key = "*ORDER*SHIPTOADDRESS*ZIPCODE";
 

$story_array = array();

$counter = 0;
class xml_story{
    var $orderid, $ordernumber, $custname, $qty, $imgname, $retailsku, $coaddress1, $coaddress2, $cocity, $costate, $cozipcode;
}

function startTag($parser, $data){
    global $current_tag;
    $current_tag .= "*$data";
    //echo "<BR>Start Tag = " . $current_tag."<BR>";
}

function endTag($parser, $data){
    global $current_tag;
    $tag_key = strrpos($current_tag, '*');
    $current_tag = substr($current_tag, 0, $tag_key);
    //echo "<BR>End Tag =" . $current_tag."<BR>";
}

function contents($parser, $data){
    global $current_tag, $xml_orderid_key, $xml_ordernumber_key, $xml_custname_key, $xml_qty_key, $xml_img_key, $xml_retailsku_key, $xml_coaddress1_key, $xml_coaddress2_key, $xml_cocity_key, $xml_costate_key, $xml_cozipcode_key, $counter, $story_array;

    switch($current_tag){
        case $xml_orderid_key:
            $story_array[$counter] = new xml_story();
            $story_array[$counter]->ORDERID = $data;
            break;
        case $xml_ordernumber_key:
            $story_array[$counter]->ORDERNUMBER = $data;
             break;
        case $xml_custname_key:
           $story_array[$counter]->NAME = $data;
           break;
        case $xml_qty_key:
            $story_array[$counter]->QUANTITY = $data;
            break;
        case $xml_cozipcode_key:
             $story_array[$counter]->ZIPCODE = $data;
              break;
        case $xml_retailsku_key:
            $story_array[$counter]->RETAILSKU = $data;
            break;
        case $xml_coaddress1_key:
            $story_array[$counter]->LINE1 = $data;
            break;
        case $xml_coaddress2_key:
            $story_array[$counter]->LINE2 = $data;
            break;
        case $xml_cocity_key:
            $story_array[$counter]->CITY = $data;
            break;
        case $xml_costate_key:
            $story_array[$counter]->STATE = $data;
            break;
        case $xml_img_key:
            $story_array[$counter]->NAME = $data;
            $counter++;
            break;
    }
}
foreach (glob('*.xml') as $filename)
{
    //unset($data);
    $xml_parser = xml_parser_create();

    xml_set_element_handler($xml_parser, "startTag", "endTag");

    xml_set_character_data_handler($xml_parser, "contents");

    $fp = fopen($filename, "r") or die("Could not open file");

    $data = fread($fp, filesize($filename)) or die("Could not read file");


    if(!(xml_parse($xml_parser, $data, feof($fp))))
        {
            die("Error on line " . xml_get_current_line_number($xml_parser));

            
         }

xml_parser_free($xml_parser);
    fclose($fp);
    //echo "<BR>File Opened = ".$filename."<BR>".$data."<BR>";
    $newfile = str_replace("xml", "ack", $filename);
    $cmd = "mv ".$filename." ".$newfile;
    //echo "Command to be executed". $cmd;
    system($cmd);
}
?>

    <html>
    <head>
    <title>Parsed Order Details </title>
    </head>
    <body bgcolor="#FFFFFF">
    <?php
        //echo "Start Before";
        //for($l=0;$l<count($Image_Name);$l++)
        //        echo "<BR>".$Image_Name[$l]."<BR>";
       //echo "End Before<hr><BR>";
       
        unset($Image_Name);
        //unset($Order_ID);
        unset($Order_Number);
        unset($Customer_Name);
        unset($Quantity);
        unset($RetailSku);
        unset($Company_Addr1);
        unset($Company_Addr2);
        unset($Company_City);
        unset($Company_Zipcode);
            //echo "Image = " . $Image_Name[0];
        for($x=0;$x<count($story_array);$x++)
            {
                if($story_array[$x]->ORDERID != '')
                $Order_ID[] = $story_array[$x]->ORDERID;
                $Order_Number[]=$story_array[$x]->ORDERNUMBER;
                $Customer_Name[] =$story_array[$x]->NAME;
                $Quantity[] = $story_array[$x]->QUANTITY;
                $Image_Name[] = $story_array[$x]->NAME;
                $RetailSku[] = $story_array[$x]->RETAILSKU;
                $Company_Addr1[] = $story_array[$x]->LINE1;
                $Company_Addr2[] = $story_array[$x]->LINE2;
                $Company_City[] = $story_array[$x]->CITY;
                $Company_State[] = $story_array[$x]->STATE;
                $Company_Zipcode[] = $story_array[$x]->ZIPCODE;
    
            }
            //echo "<br>Start after";
            //for($l=0;$l<count($Image_Name);$l++)
    //{
                
    //            echo "<BR>".$Image_Name[$l]."<BR>";
    //            
    //}
    //echo "End after<br>";
    for($j=0;$j< count($Image_Name); $j++)
    {
        if($RetailSku[$j] == 'laso2rdpers')
        $Color = "Red";
        elseif($RetailSku[$j] == 'laso2rdperss')
        {
            $Color = "Red Sample";
            $special_inst = "SAMPLE ORDER";
        }
        elseif($RetailSku[$j] == 'laso2gdpers')
            $Color = "Gold";
        elseif($RetailSku[$j] == 'laso2gdperss')
        {
            $Color = "Gold Sample";
            $special_inst = "SAMPLE ORDER";
        }
    $sql = "insert into tbl_cart (order_id, final_image, prod_type, Quantity, Color, Size, special_instructions, cust_id) values('".$Order_ID[0]."', '". $Image_Name[$j]."', 'Photo_Images', '".$Quantity[$j]."', '".$Color."', '3 1/4', '".$special_inst."', '')";
       echo "<BR>".$sql."<BR>";
    //unset($story_array);  
    $movefiles =  "mv ".$Image_Name[$j]." ".$newDirectory;
    $newfile = str_replace("xml", "ack", $filename);
    $cmd = "mv ".$filename." ".$newfile;
    //echo "Command to be executed". $cmd;
    //system($cmd);
    //unset($Image_Name);

    }//End for loop
unset ($data);
//unset($Image_Name);
?>


</body>
</html>
<?
//}//end foreach loop
//unset($Image_Name)
?>
However my arrays are not being initialized properly and so I get the values from my previous file when I parse the next file and so duplicate enteries are being made into the database.
Appreciate if anybody can help me in this.
The sample xml files that I am using are below
Code:
First xml file
[code]
<order>
        <version>2.1</version>
        <asnrequired>yes</asnrequired>
        <orderid>WAL-2222-2222-222222</orderid>
        <ordernumber>12345678987</ordernumber>
        <envelopenumber>456789</envelopenumber>
        <ordertype>Photo Gifts</ordertype>
        <entrydate>3/3/2004</entrydate>
        <orderdate>3/3/2004</orderdate>
        <printsreceived>Y</printsreceived>
        <expedite>0</expedite>
        <orderprice>42.00</orderprice>
        <redo>
            <originalorderId></originalorderId>
            <responsibility></responsibility>
            <notes></notes>    
        </redo>
        <customer>
            <name>Smith</name>
            <phone>555-555-5555</phone>
        </customer>
        <shipping>
            <carrier>Airborne</carrier>
            <carrierid>12</carrierid>
            <method>2 Day</method>
            <methodid>34</methodid>
        </shipping>
        <retailer>
            <retailerid>WAL</retailerid>        
            <retailername>Walgreens</retailername>
        </retailer>
        <store>
            <storeid>8765</storeid>
            <storename>Wilsons Super Store</storename>
        </store>
        <timestamp>11/23/03 11:31:03</timestamp>
        <duedate>12/11/2003</duedate>
        <fromaddress>
            <line1>PhotoTLC, Inc</line1>
            <line2>100 Tamal Plaza Suite 250</line2>
            <line3></line3>
            <city>Corte Madera</city>
            <county></county>
            <province></province>
            <state>CA</state>
            <zipcode>94925</zipcode>
            <country>US</country>
            <phone>555-555-5555</phone>
        </fromaddress>
        <toaddress>
            <line1>Walgreens ? Photo Dept</line1>
            <line2>Store No. 167</line2>
            <line3>Luna St  Carro St</line3>
            <city>San German</city>
            <county></county>
            <province></province>
            <state>PR</state>
            <zipcode>06823</zipcode>
            <country>US</country>
            <phone>555-555-5555</phone>
        </toaddress>
        <shiptoaddress>
            <line1>12 Mall Drive</line1>
            <line2></line2>
            <line3></line3>
            <city>Millway</city>
            <county></county>
            <province></province>
            <state>MI</state>
            <zipcode>44444</zipcode>
            <country>US</country>
                    <phone>555-555-5555</phone>
        </shiptoaddress>
        <region>12</region>
        <mailroom>222</mailroom>    
        <itemcount>1</itemcount>
        <items>
            <item>
                <itemsequence>1</itemsequence>
                <product>
                    <description>Large dual print T-Shirt w/Text</description>
                    <retailsku>P675656</retailsku>
                    <fulfillmentsku>333444555</fulfillmentsku>
                    <wholesaleprice>17.99</wholesaleprice>
                    <retailprice>29.95</retailprice>
                </product>
                <discount>
                    <reason>$5 off coupon</reason>
                    <amount>5</amount>
                </discount>
                <quantity>1</quantity>
                <comment></comment>
                <imagecount>2</imagecount>
                <images>
                    <image>
                        <description>front image</description>
                        <name>WAL-2345-7665544323-04112003-01.jpg</name>
                        <url></url>
                    </image>
                    <image>
                        <description>back image</description>
                        <name>WAL-2345-7665544323-04112003-01.jpg</name>
                        <url></url>
                    </image>
                </images>
                <itemattributecount>2</itemattributecount>
                <itemattributes>
                    <itemattribute>
                        <name>FrontText</name>
                        <value>Hello</value>
                    </itemattribute>
                    <itemattribute>
                        <name>BackText</name>
                        <value>Goodbye</value>
                    </itemattribute>
                </itemattributes>
            </item>
        </items>
</order>

Code:
second XML file
<order>
  <version>2.1</version>
  <asnrequired>no</asnrequired>
  <orderid>13238905</orderid>
  <ordernumber>13238905</ordernumber>
  <envelopenumber>071906</envelopenumber>
  <ordertype>Photo Gifts</ordertype>
  <entrydate>07/19/2006</entrydate>
  <orderdate>07/19/2006</orderdate>
  <printsreceived>N</printsreceived>
  <expedite>0</expedite>
  <orderprice>0.00</orderprice>
  <redo>
    <originalorderId></originalorderId>
    <responsibility></responsibility>
    <notes></notes>
  </redo>
  <customer>
    <name>walgreens samples</name>
    <phone>315-704-0290</phone>
  </customer>
  <shipping>
    <carrier></carrier>
    <carrierid></carrierid>
    <method></method>
    <methodid></methodid>
  </shipping>
  <retailer>
    <retailerid>USW</retailerid>
    <retailername>Walgreens</retailername>
  </retailer>
  <store>
    <storeid>10157</storeid>
    <storename>Walgreens</storename>
  </store>
  <timestamp>07/25/2006 17:02:03</timestamp>
  <duedate>08/04/2006</duedate>
  <fromaddress>
    <line1>PhotoTLC, Inc.</line1>
    <line2>3925 Cypress Drive </line2>
    <line3></line3>
    <city>Petaluma</city>
    <county></county>
    <province></province>
    <state>CA</state>
    <zipcode>94954</zipcode>
    <country>US</country>
    <phone>1-888-898-1901</phone>
  </fromaddress>
  <toaddress>
    <line1>WALGREENS - PHOTO DEPT</line1>
    <line2>Store No. 10157</line2>
    <line3>150 Grant Ave </line3>
    <city>Auburn</city>
    <county></county>
    <province></province>
    <state>NY</state>
    <zipcode>13021</zipcode>
    <country>US</country>
    <phone>315-704-0290</phone>
  </toaddress>
  <shiptoaddress>
    <line1>WALGREENS - PHOTO DEPT</line1>
    <line2>Store No. 10157</line2>
    <line3>150 Grant Ave </line3>
    <city>Auburn</city>
    <county></county>
    <province></province>
    <state>NY</state>
    <zipcode>13021</zipcode>
    <country>US</country>
    <phone>315-704-0290</phone>
  </shiptoaddress>
  <region></region>
  <mailroom></mailroom>
  <itemcount>5</itemcount>
  <items>
    <item>
      <itemsequence>11</itemsequence>
      <product>
        <description>*Clock 12&quot; Sports MLB sample</description>
        <retailsku>NWS73000536</retailsku>
        <fulfillmentsku>4315</fulfillmentsku>
        <wholesaleprice>14.0000</wholesaleprice>
        <retailprice>0.0000</retailprice>
      </product>
      <discount>
        <reason></reason>
        <amount></amount>
      </discount>
      <quantity>1</quantity>
      <comment></comment>
      <imagecount>1</imagecount>
      <images>
        <image>
         <description></description>
         <name>USW071906-25.13238905.jpg</name>
         <url>[URL unfurl="true"]http://images.phototlc.net/gifts/05/USW071906-25.13238905.jpg</url>[/URL]
        </image>
      </images>
      <itemattributecount>1</itemattributecount>
      <itemattributes>
        <itemattribute>
          <name>Baseball Team</name>
          <value>FLORIDA MARLINS|14-31</value>
        </itemattribute>
      </itemattributes>
    </item>
    <item>
      <itemsequence>12</itemsequence>
      <product>
        <description>*Mousepad Sports NFL Sample</description>
        <retailsku>NWS80000544</retailsku>
        <fulfillmentsku>5620</fulfillmentsku>
        <wholesaleprice>5.8000</wholesaleprice>
        <retailprice>0.0000</retailprice>
      </product>
      <discount>
        <reason></reason>
        <amount></amount>
      </discount>
      <quantity>1</quantity>
      <comment></comment>
      <imagecount>1</imagecount>
      <images>
        <image>
         <description></description>
         <name>USW071906-26.13238905.jpg</name>
         <url>[URL unfurl="true"]http://images.phototlc.net/gifts/05/USW071906-26.13238905.jpg</url>[/URL]
        </image>
      </images>
      <itemattributecount>1</itemattributecount>
      <itemattributes>
        <itemattribute>
          <name>Football Team</name>
          <value>PHIL EAGLES|10-51</value>
        </itemattribute>
      </itemattributes>
    </item>
    <item>
      <itemsequence>13</itemsequence>
      <product>
        <description>*Mug 11oz. White Sports MLB Sample</description>
        <retailsku>NWS81000545</retailsku>
        <fulfillmentsku>2571</fulfillmentsku>
        <wholesaleprice>6.8000</wholesaleprice>
        <retailprice>0.0000</retailprice>
      </product>
      <discount>
        <reason></reason>
        <amount></amount>
      </discount>
      <quantity>1</quantity>
      <comment></comment>
      <imagecount>1</imagecount>
      <images>
        <image>
         <description></description>
         <name>USW071906-27.13238905.jpg</name>
         <url>[URL unfurl="true"]http://images.phototlc.net/gifts/05/USW071906-27.13238905.jpg</url>[/URL]
        </image>
      </images>
      <itemattributecount>1</itemattributecount>
      <itemattributes>
        <itemattribute>
          <name>Baseball Team</name>
          <value>MINNESOTA TWINS|14-41</value>
        </itemattribute>
      </itemattributes>
    </item>
    <item>
      <itemsequence>14</itemsequence>
      <product>
        <description>*Stein 16 oz Sports NFL, sample</description>
        <retailsku>NWS88000556</retailsku>
        <fulfillmentsku>5546</fulfillmentsku>
        <wholesaleprice>8.8000</wholesaleprice>
        <retailprice>0.0000</retailprice>
      </product>
      <discount>
        <reason></reason>
        <amount></amount>
      </discount>
      <quantity>1</quantity>
      <comment></comment>
      <imagecount>1</imagecount>
      <images>
        <image>
         <description></description>
         <name>USW071906-28.13238905.jpg</name>
         <url>[URL unfurl="true"]http://images.phototlc.net/gifts/05/USW071906-28.13238905.jpg</url>[/URL]
        </image>
      </images>
      <itemattributecount>1</itemattributecount>
      <itemattributes>
        <itemattribute>
          <name>Football Team</name>
          <value>SD CHARGERS|10-57</value>
        </itemattribute>
      </itemattributes>
    </item>
    <item>
      <itemsequence>15</itemsequence>
      <product>
        <description>*Tumbler 16 oz Slimline Sports MLB Sample</description>
        <retailsku>NWS89000560</retailsku>
        <fulfillmentsku>5544</fulfillmentsku>
        <wholesaleprice>8.0000</wholesaleprice>
        <retailprice>0.0000</retailprice>
      </product>
      <discount>
        <reason></reason>
        <amount></amount>
      </discount>
      <quantity>1</quantity>
      <comment></comment>
      <imagecount>1</imagecount>
      <images>
        <image>
         <description></description>
         <name>USW071906-29.13238905.jpg</name>
         <url>[URL unfurl="true"]http://images.phototlc.net/gifts/05/USW071906-29.13238905.jpg</url>[/URL]
        </image>
      </images>
      <itemattributecount>1</itemattributecount>
      <itemattributes>
        <itemattribute>
          <name>Baseball Team</name>
          <value>ATLANTA BRAVES|14-11</value>
        </itemattribute>
      </itemattributes>
    </item>
  </items>
</order>

Thanks,
tewari
 
teweri,

Is there some reason you are not using the Document Object Model (DOM)? That would obviate the need for all the parsing logic and you would have a much simpler PHP module. Here is PHP DOM documentation.

Also, the following if statement looks unusual, but I cannot really determine if it is your intent.
Code:
        for($x=0;$x<count($story_array);$x++)
            {
                [COLOR=red]if($story_array[$x]->ORDERID != '')
                $Order_ID[] = $story_array[$x]->ORDERID;[/color]
                $Order_Number[]=$story_array[$x]->ORDERNUMBER;
                $Customer_Name[] =$story_array[$x]->NAME;

Tom Morrison
 
Hi K5tm,
This is for the first time that I have written an xml parser in php, don't have much experience in this field.
The if statemet that you have pointed out is no longer necessary, I was trying to use it in case there are several orderid per xml document and several images per order, but that's not at all necessary.
In the present code, I am not able to initialize the arrays for each file, that seems to be the problem, can you point out where I am missing initializing the arrays.
In the meantime I will look into the DOM documentation that you have suggested.

Thanks,
tewari
 
Status
Not open for further replies.

Part and Inventory Search

Sponsor

Back
Top