将新节点添加到xml文件会破坏XML结构

时间:2012-02-16 13:30:12

标签: php xml simplexml

我正在运行一个脚本,用于检查XML缓存文件中的货币代码。如果xml缓存不包含货币代码,那么PHP将添加它。像这样:

<currencies>
  <currency id="GBP">
    <title>Pound Sterling</title>
    <loc>United Kingdom, Crown Dependencies (the Isle of Man and the Channel Islands), certain British Overseas Territories(South Georgia and the South Sandwich Islands, British Antarctic Territory and British Indian Ocean Territory)</loc>
    <rate>0.6383</rate>
    <timestamp>1329398333</timestamp>
  </currency>
</currency>

当缓存完全为空并且我第一次运行脚本时,它如上所示运行良好。第二次我以不同的货币运行它,它更新缓存文件BUT没有数据......或者它只是打破了结构。像这样:

<?xml version="1.0"?>
<currencies>
  <currency id="GBP">
    <title>Pound Sterling</title>
    <loc>United Kingdom, Crown Dependencies (the Isle of Man and the Channel Islands), certain British Overseas Territories(South Georgia and the South Sandwich Islands, British Antarctic Territory and British Indian Ocean Territory)</loc>
    <rate>0.6383</rate>
    <timestamp>1329398333</timestamp>
  </currency>
  <currency id

最后,如果我再次为第三种货币运行脚本,它会完全修复结构并添加之前错过的所有正确数据!

以下是进行更新的代码:

    if(empty($ratesTimeStamp)) {

        $newXML = simplexml_load_file('cache/rates.xml');

        $child = $newXML->addChild('currency');
        $child->addAttribute('id', ''.$to.'');
        $child->addChild('title', $toTitle);
        $child->addChild('loc', $toLocation);
        $child->addChild('rate', $finalRate);
        $child->addChild('timestamp', time());

        $dom = new DOMDocument('1.0');
        $dom->preserveWhiteSpace = false;
        $dom->formatOutput = true;
        $dom->loadXML($newXML->asXML());

        file_put_contents('cache/rates.xml', $dom->saveXML());
    }

1 个答案:

答案 0 :(得分:0)

好的,这没什么问题。

它打破了文件,因为我在文本编辑器中打开了文件,每次更新文件时,我的文本编辑器询问我是否要更新打开的文件...这样做会导致文件中断原因。

如果我在文本编辑器中关闭该文件并像往常一样运行脚本,那么它可以正常工作!