在PHP中更新特定的XML节点

在PHP中更新特定的XML节点,php,xml,domdocument,sitemap,Php,Xml,Domdocument,Sitemap,我有一个文件夹,管理员可以上传图像。每组图像都与特定URL相关,并被跟踪到站点地图结构中: 基本XML站点地图 <url> <loc>URL1</loc> <image:image> <image:loc>Image1 URL</image:loc> <image:caption>Image1 Caption</image:caption> </image

我有一个文件夹,管理员可以上传图像。每组图像都与特定URL相关,并被跟踪到站点地图结构中:

基本XML站点地图

 <url>
   <loc>URL1</loc>
   <image:image>
     <image:loc>Image1 URL</image:loc>
     <image:caption>Image1 Caption</image:caption>
   </image:image>
   <image:image>
     <image:loc>Image2 URL</image:loc>
     <image:caption>Image2 Caption</image:caption>
   </image:image>
 </url> 

 <url>
    <loc>URL2</loc>
   <image:image>
     <image:loc>Image3 URL</image:loc>
     <image:caption>Image3 Caption</image:caption>
   </image:image>
 </url>
 <url>
   <loc>URL1</loc>
   <image:image>
     <image:loc>Image2 URL</image:loc>
     <image:caption>Image2 Caption</image:caption>
   </image:image>
   <image:image>
     <image:loc>Image4 URL</image:loc>
     <image:caption>Image4 Caption</image:caption>
   </image:image>
 </url> 

 <url>
    <loc>URL2</loc>
   <image:image>
     <image:loc>Image3 URL</image:loc>
     <image:caption>Image3 Caption</image:caption>
   </image:image>
 </url>
我正在寻找一种高效的方式来执行更新。我已经找到了,但是(如果我正确地得到它)要更新URL数据,我需要迭代所有URL节点,找到特定节点(即使用正则表达式),然后更新其中的数据(即删除所有图像并插入新图像)

PHP

$dom = new DOMDocument('1.0');
$dom->load('images.xml');

$urls = $dom->getElementsByTagName('url');

foreach($urls as $url)
{
    $locs = $url->getElementsByTagName('loc');
    $loc = $locs->item(0)->nodeValue;

    // check $loc with regular expression and make updates to specific node
}

老实说,我认为这不是一个有效的解决方案。有没有一种快速的方法可以找到特定的URL节点并更新其中的图像数据?

什么是效率低下?有成千上万的人需要更新吗?也许可以,但是,您可以使用xpath搜索您想要的唯一节点,然后进行更改,而不是循环所有节点。@Ghost:不,每次只搜索一个URL节点。我的“无效”定义与以下事实有关:如果我有一个包含100个图像的URL节点,管理员删除1个图像并上载1个新图像,我必须删除所有图像子节点,然后在节点内插入更新的图像列表。另一种方法是解析每个图像子级,并检查它是否仍然存在于文件夹中(我认为这不是很有效)。我要寻找的是与updatemysql命令等效的东西,但应用于XML。您删除了映像中的每个子节点吗?为什么?你只需要选择一个子节点,然后删除它,批量删除节点,我不知道是否有。不,你真的不需要选择每个图像节点。只需选择需要删除的内容。在这种情况下,可以使用xpath。查询需要删除的内容,然后进行必要的删除。不循环每个子节点并在迭代中等待该子节点,然后删除。@Giorgio不进行迭代,而是查看
xpath
以选择具有需要更新的URL的节点。