当前位置: 首页 > 面试题库 >

在PHP的SimpleXML中,删除具有特定属性的子级

冷英博
2023-03-14
问题内容

我有几个使用SimpleXML访问的具有不同属性的相同元素:

<data>
    <seg id="A1"/>
    <seg id="A5"/>
    <seg id="A12"/>
    <seg id="A29"/>
    <seg id="A30"/>
</data>

我需要删除ID为“ A12” 的特定 seg 元素,该怎么做?我尝试遍历 seg 元素并未 设置
特定的元素,但这不起作用,元素仍然存在。

foreach($doc->seg as $seg)
{
    if($seg['id'] == 'A12')
    {
        unset($seg);
    }
}

问题答案:

尽管SimpleXML提供了一种删除XML节点的方法,但其修改功能还是受到一定限制。另一种解决方案是使用DOM扩展。dom_import_simplexml()将帮助您将转换SimpleXMLElementDOMElement

只是一些示例代码(经过PHP 5.2.5测试):

$data='<data>
    <seg id="A1"/>
    <seg id="A5"/>
    <seg id="A12"/>
    <seg id="A29"/>
    <seg id="A30"/>
</data>';
$doc=new SimpleXMLElement($data);
foreach($doc->seg as $seg)
{
    if($seg['id'] == 'A12') {
        $dom=dom_import_simplexml($seg);
        $dom->parentNode->removeChild($dom);
    }
}
echo $doc->asXml();

输出

<?xml version="1.0"?>
<data><seg id="A1"/><seg id="A5"/><seg id="A29"/><seg id="A30"/></data>

顺便说一句:使用XPath(SimpleXMLElement->xpath)时,选择特定节点要简单得多:

$segs=$doc->xpath('//seq[@id="A12"]');
if (count($segs)>=1) {
    $seg=$segs[0];
}
// same deletion procedure as above


 类似资料:
  • 问题内容: 在XML文档中,我具有共享相同名称的元素,但是属性的值定义了它是什么类型的数据,并且我想从文档中选择所有具有特定值的元素。我是否需要使用XPath(如果可以,您是否可以建议正确的语法)还是有更优雅的解决方案? 这是一些示例XML: 我想选择类型为的所有子代标签的内容。 PS-我正在尝试使用PHP与Netflix API进行接口-这对我的问题无关紧要,但是如果您想提出一种更好的方法,我非

  • 问题内容: 我有这个数据结构,在这里组织待办事项以遵循路径/ todos / uid / 我想查询待办事项以获取所有记录。使用firebase(angularfire)是否可能,我应该怎么做?还是我应该进一步规范化并安排路径/私人路线,以免走下待办事项? 问题答案: Firebase中没有子句。请查看此线程,以获取有关按多个字段进行搜索的一些出色的结构性技巧,有关数据库样式查询的该线程,有关查询的

  • 问题内容: 我在这里有以下xml文档:编辑:(请参见下面的示例) 我正在使用php / SimpleXML将其转换为对象以读取它: 当我使用print_r时,我看到字段的属性,但没有显示可接受值的属性。这是原始xml的示例(我需要value属性): 这是我在print_r时看到的: 为什么没有显示属性的任何线索?提前致谢。 编辑:请求一些xml: 问题答案: 这里的简单答案是不与SimpleXML

  • 问题内容: 我有一个JSON: 我试图删除所有以 “ umb_” 开头的属性。这在json.net中可能吗? 输出将是这样的: 使用删除我能够做到,但是不能一次全部完成。 有什么建议吗? 问题答案: 您可以先解析字符串: 更新 或: 更新#2 您可以在子句中指定更多条件: 要么 或任何您需要的。

  • } 现在,我的要求是当我单击“删除列”时,它会进入此方法,并且我想删除与之关联的特定列和行。 提前谢谢你的帮助。

  • 我有一个SVG文档,其中包含类似于以下内容的节点: 我想做的只是选择