首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用php -非正统xml从xml中删除元素

使用php -非正统xml从xml中删除元素
EN

Stack Overflow用户
提问于 2012-04-12 09:54:07
回答 1查看 52关注 0票数 0

我创建了一个解析xml文档的ios应用程序。如果用户登录,他们的信息将添加到xml文件中。我希望能够删除一个用户,如果他们正在注销或取消他们的登录。从本质上讲,我需要弄清楚如何删除如下所示的xml对象(在本例中是一个酒保):

代码语言:javascript
运行
复制
<Bars>
    <Bar>
        <bar_id>0</bar_id>
        <Bartenders>
            <Bartender>
                <imageURL>unique URL</imageURL>
                <shift>20:30</shift>
            </Bartender>
        </Bartenders>
    </Bar>
    <Bar>
        <bar_id>1</bar_id>
        <Bartenders>
               <Bartender>
                      <imageURL>aURL</imageURL>
                      <shift>a shift</shift>
                </Bartender>
                <Bartender>
                          <imageURL>aURL</imageURL>
                          <shift>a shift</shift>
                </Bartender>
        </Bartenders>
    </Bar>

例如,我想根据唯一的imageURL删除一个用户...我也会知道bar_id。这是我到目前为止所用的php,但我完全愿意接受关于以不同的方式完成它的建议。

代码语言:javascript
运行
复制
    $newimageURL = $row['imageURL'];
    $newBar_ID = $row['Bar_ID'];

    $xmlUrl = "Bars.xml"; // XML 
    $xmlStr = file_get_contents($xmlUrl);
    $xml = new SimpleXMLElement($xmlStr);
    $bartenders = $xml->xpath('//Bartenders');

         // something needs to happen here to remove the child

    $xml->asXML('Bars.xml');

有人告诉我,我可以使用这样的东西:

代码语言:javascript
运行
复制
$bartenders->removeChild($bartenders[$newBar_ID]);

或者xpath,但我不确定如何使用唯一的imageXML正确地找到正确的调酒师。我知道我应该更好地计划/设计这件事,但我的时间很紧,这将不得不这样做。

抱歉,我的php太差了。谢谢你的帮助。

EN

回答 1

Stack Overflow用户

发布于 2012-04-12 09:58:07

http://php.net/manual/fr/ref.simplexml.php上有一个非常好的脚本,它工作得非常好

代码语言:javascript
运行
复制
function removeNode($xml, $path, $multi='one')
{
   $result = $xml->xpath($path);

      # for wrong $path
      if (!isset($result[0])) return false;

      switch ($multi) {
          case 'all':
                $errlevel = error_reporting(E_ALL & ~E_WARNING);
                foreach ($result as $r) unset ($r[0]);
                error_reporting($errlevel);
                return true;

            case 'child':
               unset($result[0][0]);
               return true;

            case 'one':
               if (count($result[0]->children())==0 && count($result)==1) {
                   unset($result[0][0]);
                   return true;
               }

            default:
                  return false;             
      }

}

有关更多信息,请单击链接

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10116405

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档