0

I've searched from other topic like what I've done for many years but I couldn't get any answer. and it is first time to ask here.

Original code

<?xml version="1.0" ?>
<files>
 <fileGroup id="0">
  <file_val id="000">
   <file_val_sub id="0000" extension="exe">file1.exe</file_val_sub>
   <file_val_sub id="0001" extension="doc">docu.doc</file_val_sub>
   <file_val_sub id="0002" extension="mp3">song.mp3</file_val_sub>
  </file_val>
  <file_val id="001">
   <file_val_sub id="0010" extension="csv">spr.csv</file_val_sub>
   <file_val_sub id="0011" extension="jpg">img.jpg</file_val_sub>
   <file_val_sub id="0012" extension="gif">pic.gif</file_val_sub>
  </file_val>
  <file_val id="002"extension="csv">file22.csv</file_val_sub>
  <file_val id="003"extension="txt">file33.txt</file_val_sub>
  <file_val id="004"extension="doc">file44.doc</file_val_sub>
  ...
 </fileGroup>
</files>

I want to update the xml file as below example.

<?xml version="1.0" ?>
<files>
 <fileGroup id="0">
  <file_val id="000">
   <file_val_sub id="0000" extension="exe">http://mysite.com/file1.exe</file_val_sub>
   <file_val_sub id="0001" extension="doc">http://mysite.com/docu.doc</file_val_sub>
   <file_val_sub id="0002" extension="mp3">http://mysite.com/song.mp3</file_val_sub>
  </file_val>
  <file_val id="001">
   <file_val_sub id="0010" extension="csv">http://mysite.com/spr.csv</file_val_sub>
   <file_val_sub id="0011" extension="jpg">http://mysite.com/img.jpg</file_val_sub>
   <file_val_sub id="0012" extension="gif">http://mysite.com/pic.gif</file_val_sub>
  </file_val>
  <file_val id="002"extension="csv">http://mysite.com/file22.csv</file_val_sub>
  <file_val id="003"extension="txt">http://mysite.com/file33.txt</file_val_sub>
  <file_val id="004"extension="doc">http://mysite.com/file44.doc</file_val_sub>
  ...
 </fileGroup>
</files>

I could get and find value using simplexml_load_file() but I cannot modify and save it.

$xml =simplexml_load_file($xml_url);

Thank you in advance.

EDITED...

My code is not really simple and dirty, but I could modify and save it at least... If there is more better way to do this (of course, there are), please let me know.

function getXmlForPreview($xml_url,$val,$file_path)
{    
  // Load File
  $xml =simplexml_load_file($xml_url);
    // Check child nodes
    $multi_node = true;
    if (count($xml->layout->layout_val) == 1) {
      $multi_node = false;
    }
    else if (count($xml->layout->layout_val) > 1) {
      $multi_node = true;
    }

    if ($multi_node)
    {
        for($i=0;$i<count($xml->layout->layout_val);$i++)
        {       
            for($j=0;$j<count($xml->layout->layout_val[$i]);$j++)
            {
               $xml->layout->layout_val[$i]->layout_val_sub[$j][0] = $val . (string) $xml->layout->layout_val[$i]->layout_val_sub[$j][0];
            }
        }
     }
     else // no multi child
     {
       for($j=0;$j<count($xml->layout->layout_val[0]);$j++)
       {
          $xml->layout->layout_val[0]->layout_val_sub[$j][0] = $val . (string) $xml->layout->layout_val[0]->layout_val_sub[$j][0];
       }
     }
     $xml->asXML($file_path);
}

getXmlForPreview("http://mysite.com/xmls/abc.xml",""http://mysite.com/,"/var/www/new_xml.xml");
Taek
  • 51
  • 1
  • 3
  • post your code and we will assist you from there on how to save it. – Prix Jul 12 '13 at 15:35
  • Yes please show where you are having problems relating to modifying the XML document. Just showing the beginning and desired end states tells us nothing about where you are having problems. – Mike Brant Jul 12 '13 at 15:39
  • 2
    Why can't you modify and save it? The SimpleXML library gives you the tools to do what you want. Coupled with a `foreach()`, you should be able to step through your file, change what you want, and save it when you're done. http://us1.php.net/manual/en/simplexml.examples-basic.php and look specifically at examples #4 and #9. – WWW Jul 12 '13 at 15:39
  • Thank you all for your comments. – Taek Jul 13 '13 at 07:22
  • @Crontab Yes, as the example #9 asXML() did job. I did $xml->asXML($file_path); and it saved to xml file from object. Thanks! – Taek Jul 13 '13 at 07:25

1 Answers1

-1

I like to use regular expression if the xml file is not too large.It's more flexible, I think.

$str = <<<end
<?xml version="1.0" ?>
<files>
 <fileGroup id="0">
  <file_val id="000">
   <file_val_sub id="0000" extension="exe">file1.exe</file_val_sub>
   <file_val_sub id="0001" extension="doc">docu.doc</file_val_sub>
   <file_val_sub id="0002" extension="mp3">song.mp3</file_val_sub>
  </file_val>
  <file_val id="001">
   <file_val_sub id="0010" extension="csv">spr.csv</file_val_sub>
   <file_val_sub id="0011" extension="jpg">img.jpg</file_val_sub>
   <file_val_sub id="0012" extension="gif">pic.gif</file_val_sub>
  </file_val>
  <file_val id="002"extension="csv">file22.csv</file_val_sub>
  <file_val id="003"extension="txt">file33.txt</file_val_sub>
  <file_val id="004"extension="doc">file44.doc</file_val_sub>
  ...
 </fileGroup>
</files>
end;
echo $str.PHP_EOL;
var_dump(preg_replace('/>(.+\..+)?</','>http://mysite.com/$1<',$str));
Fly_pig
  • 155
  • 8
  • Don't reinvent the wheel. There's a reason SimpleXML was written. – WWW Jul 12 '13 at 15:50
  • @Crontab Regular Expression is a wheel too.I didn't reinvent anything.I move on this wheel just because I think it's easy to understand, less to code and faster. – Fly_pig Jul 23 '13 at 07:45
  • Read this: http://stackoverflow.com/questions/590747/using-regular-expressions-to-parse-html-why-not – WWW Jul 23 '13 at 13:55