【问题标题】:Delete all elements of a certain type from an XML doc using PHP使用 PHP 从 XML 文档中删除特定类型的所有元素
【发布时间】:2011-05-09 19:23:45
【问题描述】:

我有一个简单的任务:从 XML 文档中删除 <places> 节点及其后代,留下其他节点。

我试过这段代码,但它没有工作......

$document->preserveWhiteSpace = false; 
$books = $xpath->query('piletilve_info/places');
//echo "4";

foreach ($books as $places) {
    while($places->hasChildNodes()) {
        $places->removeChild($places->childNodes->item(0));
    }

    $places->parentNode->removeChild($places);
}

要处理的源 XML:

<piletilve_info>
   <places>
      <place>
        ...
      </place>
   </places>
   <other node>
      ...
   </other node>
</piletilve_info>

在实际数据中还有更多不是地点的节点,但为简单起见,此示例仅显示了几个。

我看到了 C# 示例,但我无法将代码移植到 PHP。

澄清:在代码 sn-p 中,变量$books 只是查询列表的持有者。这个名字没有意义。

【问题讨论】:

  • 请注意,“它不起作用”几乎没有告诉我们任何信息。与其告诉我们某件事没有按照您的意愿去做,不如告诉我们它做了什么。除此之外,这是一篇很好的文章:你告诉我们你想要完成什么,并显示一个minimal yet fairly complete and representational code sample 和它所处理的数据。

标签: php xml recursion nodes


【解决方案1】:

目标是删除整个节点,留下其他节点(实际上还有更多,但为简单起见,此示例显示所有节点

$dom = new DOMDocument;
$dom->load('places.xml');
foreach ($dom->getElementsByTagName('places') as $places)
{
    $places->parentNode->removeChild($places);
}
echo $dom->saveXml();

将删除文档中任意位置的所有 &lt;places&gt; 元素,包括所有子元素。

输出:

<?xml version="1.0"?>
<piletilve_info>

   <other>
      ...
   </other>
</piletilve_info>

【讨论】:

  • 测试。 ;) 感谢您这么快的回答:)
  • @HX 如果您需要查询特定元素,您只需要 XPath。 getElementsByTagName('places') 基本上类似于//places,因此它与piletilve_info/places 不同,后者仅获取根节点正下方的places 元素。这取决于您要获取的内容。
【解决方案2】:

当我使用接受的答案时,它不会删除所有出现的标签。 foreach 循环可能会跳过标记,因为 foreach 依赖于内部数组指针,并且在循环内更改它会导致意外行为。

我发现的可行解决方案如下所示。

$dom = new DOMDocument;
$dom->load('places.xml');
$placesNodes = $dom->getElementsByTagName('places') 
while ($placesNodes->length > 0) {
    $node = $placesNodes->item(0);
    $node->parentNode->removeChild($node);
}
echo $dom->saveXml();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-27
    • 2013-09-09
    • 2019-08-06
    • 1970-01-01
    相关资源
    最近更新 更多