2017-03-09 1 views
1

J'ai actuellement un petit problème avec SimpleXML. Je ne sais pas pourquoi, mais pour une raison quelconque, il ne sauve pas mes changements dans le fichier XML.Modification des résultats XPATH n'affectent pas le document

<?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> 

Je voulais trier le fichier xml pour obtenir les jours de la semaine dans l'ordre (par 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'); 

La sortie est bien, mais pour une raison quelconque, il ne sauvera pas mes modifications dans le fichier, il crée le fichier mais avec l'ancien arbre XML donc je suppose que je dois en quelque sorte appliquer mon arbre trié (écraser bien sûr).

Est-ce que quelqu'un ici a une réponse pour cela?

+0

Après avoir fait 'arbres $ = $ XML-> XPath ('// * [@ date]'),' 'trees' $ est un tableau de résultats qui n'a pas de connexion avec '$ xml'. Vous devez créer un véritable objet simple_xml à partir de $ trees. – JustOnUnderMillions

+0

Vous tenez pour acquis que le tableau d'objets 'SimpleXMLElement' renvoyé par' SimpleXMLElement :: xpath() 'est lié à l'original' SimpleXMLElement'. Docs ne dit rien à ce sujet et c'est probablement trop une hypothèse. –

+0

Lisez ici comment c'est fait: http://stackoverflow.com/questions/23105465/how-to-update-xml-file-using-php Dans la réponse, cherchez '// Remplacer les anciens éléments par new' – JustOnUnderMillions

Répondre

1

Donc ce que vous pouvez faire est:

//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'); 
+0

a travaillé comme un charme, merci – NoLand