2017-03-09 30 views
1

我目前在SimpleXML中遇到了一個小問題。我不知道爲什麼,但由於某種原因,它不保存我在XML文件中的更改。編輯XPATH結果不會影響文檔

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

我想排序的xml文件來獲取平日爲了(按日期)

$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'); 

輸出是不錯,但由於某種原因,它不會改變我保存到文件,它創建的文件,但與舊的XML樹,所以我想我必須以某種方式應用我的排序樹(當然覆蓋)。

有人在這裏有這個答案嗎?

+0

做'$樹= $ XML的>的XPath後( '// * [@日期]');''$ trees'是一個結果數組沒有連接到'$ xml'。你必須從$樹中創建一個真正的simple_xml對象。 – JustOnUnderMillions

+0

您認爲'SimpleXMLElement :: xpath()'返回的'SimpleXMLElement'對象數組被鏈接到原始的'SimpleXMLElement'。 Docs對此沒有任何說明,這可能太過於假設。 –

+0

在這裏閱讀它是如何完成的:http://stackoverflow.com/questions/23105465/how-to-update-xml-file-using-php在答案中尋找'//用新的替換舊元素' – JustOnUnderMillions

回答

1

所以你可以做的是:

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

像魅力一樣工作,謝謝 – NoLand