Search code examples
phpsortingxpathsimplexml

Editing XPATH results do not affect document


I am currently having a small problem with SimpleXML. I don't know why but for some reason its not saving my changes in the XML file.

<?xml version="1.0" encoding="ISO-8859-1"?>
<KW10>
  <dienstag date="07.03.2017">
    <arbeitszeit/>
    <pausen/>
    <kilometer/>
    <fahrer/>
    <hotel/>
    <fahrtzeit_hin/>
    <fahrtzeit_weg/>
    <erledigt/>
  </dienstag>
  <mittwoch date="08.03.2017">
    <arbeitszeit/>
    <pausen/>
    <kilometer/>
    <fahrer/>
    <hotel/>
    <fahrtzeit_hin/>
    <fahrtzeit_weg/>
    <erledigt/>
  </mittwoch>
  <donnerstag date="09.03.2017">
    <arbeitszeit/>
    <pausen/>
    <kilometer/>
    <fahrer/>
    <hotel/>
    <fahrtzeit_hin/>
    <fahrtzeit_weg/>
    <erledigt/>
  </donnerstag>
  <freitag date="10.03.2017">
    <arbeitszeit/>
    <pausen/>
    <kilometer/>
    <fahrer/>
    <hotel/>
    <fahrtzeit_hin/>
    <fahrtzeit_weg/>
    <erledigt/>
  </freitag>
  <samstag date="11.03.2017">
    <arbeitszeit/>
    <pausen/>
    <kilometer/>
    <fahrer/>
    <hotel/>
    <fahrtzeit_hin/>
    <fahrtzeit_weg/>
    <erledigt/>
  </samstag>
  <sonntag date="12.03.2017">
    <arbeitszeit/>
    <pausen/>
    <kilometer/>
    <fahrer/>
    <hotel/>
    <fahrtzeit_hin/>
    <fahrtzeit_weg/>
    <erledigt/>
  </sonntag>
    <montag date="06.03.2017">
        <arbeitszeit von="21:00" bis="05:00"/>

        <kilometer/>
        <fahrer is="true"/>
        <hotel/>
        <fahrtzeit_hin von="20:30" bis="20:45"/>
        <fahrtzeit_weg von="05:15" bis="05:30"/>
        <erledigt/>
        <pausen>
            <pause_0 von="23:30" bis="00:00"/>
        </pausen>
    </montag>
</KW10>

I wanted to sort the xml file to get the weekdays in order (by date)

$xml = simplexml_load_file('users/'.$_SESSION['vorname'].$_SESSION['nachname'].'/'.$kw.'.xml');
$trees = $xml->xpath('//*[@date]');
usort ($trees, function($a, $b) { return strcmp($a['date'], $b['date']); });
echo '<pre>'; print_r($trees); echo '</pre>';
$xml->asXML('kwtest.xml');

The Output is fine but for some reason it won't save my changes to the file, it creates the file but with the old xml tree so I guess I have to somehow apply my sorted tree (overwrite of course).

Is anyone in here having an answer for this?


Solution

  • So what you can do is:

    //After creating sorted $trees generate a new xml 
    $newXml = '';
    foreach($trees as $t){
        $newXml .= $t->asXML().PHP_EOL;
    }
    #merge that with header and root-node
    $newXml = simplexml_load_string('<?xml version="1.0" encoding="ISO-8859-1"?>
    <KW10>
    '.$newXml.'
    </KW10>');
    #now it looks like
    echo '<pre>'; print_r(htmlentities($newXml->asXML())); echo '</pre>';
    #save it, maybe unlink the old version before
    $newXml->asXML('kwtest.xml');