【问题标题】:php replacing xml node valuesphp替换xml节点值
【发布时间】:2013-07-11 05:04:49
【问题描述】:

我已经搜索了其他主题,例如我多年来所做的事情,但我无法得到任何答案。也是第一次来这里问。

原始代码

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

我想更新xml文件,如下例。

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

我可以使用 simplexml_load_file() 获取和查找值,但我无法修改和保存它。

$xml =simplexml_load_file($xml_url);

提前谢谢你。

已编辑...

我的代码不是很简单和肮脏,但我至少可以修改并保存它...... 如果有更好的方法(当然有),请告诉我。

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");

【问题讨论】:

  • 发布您的代码,我们将帮助您从那里保存它。
  • 是的,请说明您在修改 XML 文档时遇到的问题。仅显示开始和期望的结束状态并不能告诉我们您在哪里遇到问题。
  • 为什么不能修改保存? SimpleXML 库为您提供了做您想做的事情的工具。再加上foreach(),您应该能够逐步浏览您的文件,更改您想要的内容,并在完成后保存它。 us1.php.net/manual/en/simplexml.examples-basic.php 并具体查看示例 #4 和 #9。
  • 谢谢大家的cmets。
  • @Crontab 是的,作为示例 #9 asXML() 完成了工作。我做了 $xml->asXML($file_path);并将其从对象保存到 xml 文件中。谢谢!

标签: php xml replace


【解决方案1】:

如果xml文件不太大,我喜欢使用正则表达式。我认为它更灵活。

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

【讨论】:

  • 不要重新发明轮子。编写 SimpleXML 是有原因的。
  • @Crontab 正则表达式也是一个轮子。我没有重新发明任何东西。我在这个轮子上移动只是因为我认为它易于理解,代码更少,速度更快。
猜你喜欢
  • 2014-08-27
  • 2018-03-05
  • 2013-09-07
  • 1970-01-01
  • 2013-12-30
  • 2013-07-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多