【问题标题】:Remove xml element node based on index根据索引删除xml元素节点
【发布时间】:2015-01-19 05:22:17
【问题描述】:

我有一个包含许多元素的 xml 文件,我希望根据它们的索引删除某些元素。

示例 XML:

<songs>
   <song>
      <title>A</title>
      <artist>AA</artist>
   </song>
</songs>

到目前为止我的 PHP 代码:

<?php

$index = $_GET['song'];

$doc = new DOMDocument();
$doc->load("songs.xml");
$songs = $doc->getElementsByTagName("song");

foreach($songs as $song) {
    if(in_array($song[$index], $songs)){
        unset($song);
    }
}
$doc->save("songlist.xml");

?>

但是我从这段代码中得到了这个错误:

Fatal error: Cannot use object of type DOMElement as array

感谢您在此问题上的任何帮助,谢谢。

【问题讨论】:

  • 你到底想取消什么?整个&lt;song&gt;?
  • @Ghost 是的,我正在尝试删除歌曲的整首歌曲。

标签: php arrays xml domdocument


【解决方案1】:

如果您的意图是删除整​​个 &lt;song&gt; 元素。使用-&gt;removeChild()

$songs = $doc->getElementsByTagName('song');
$hated_artists = array('AA', 'BB', 'CC');
foreach($songs as $song) {
    $artist = $song->getElementsByTagName('artist')->item(0)->nodeValue;
    if(in_array($artist, $hated_artists)) { // if this song is sang by one of your hated artists
        $song->parentNode->removeChild($song); // remove this song
    }
}

Sample Usage

如果您只想要一个简单的标准,通过您想要的键删除,那么只需使用foreach 键。示例:

$keys_to_be_removed = array(14, 18);
foreach($songs as $key => $song) {
    if(in_array($key, $keys_to_be_removed)) {
        $song->parentNode->removeChild($song);
    }
}

或者只是显式地使用索引来删除而不使用 foreach 循环:

// starts at index zero
$first_song = $doc->getElementsByTagName('song')->item(0);
$songs = $doc->documentElement;
$songs->removeChild($first_song);

【讨论】:

  • 感谢有关 ->removeChild() 的提示。但我并不是要删除我讨厌的艺术家。想象在歌曲根元素中有 30 个歌曲元素。我只想根据索引删除其中一个。例如歌曲[14]、歌曲[8]等。我该怎么做?
  • @SunnyD 哦,好吧,只需使用 foreach 键。但请记住,这是从零开始的,所以第一首歌将落在索引零上。检查我的编辑。我以为你想删除你讨厌的歌曲/艺术​​家,哈哈
  • @SunnyD 我也在我的修订中添加了另一条信息,好吧,我认为这是你删除的标准:D,无论如何我很高兴这有帮助
【解决方案2】:
$songs = $doc->getElementsByTagName('song');

$songs.item(1).parentNode.removeChild($songs.item(1));
$songs.item(7).parentNode.removeChild($songs.item(7));
$songs.item(12).parentNode.removeChild($songs.item(12));

等等……

【讨论】:

  • 我也试过了,但是虽然它消除了错误,但它没有从 xml 文件中删除元素...
【解决方案3】:

XPath 可以通过索引/位置选择节点(从 1 开始)。它总是会返回一个可以用 foreach 遍历的节点列表。如果索引不存在,列表将为空。要从 DOM 中删除节点,您必须将其从其父节点中删除。

$xml = <<<'XML'
<songs>
   <song>
      <title>A</title>
      <artist>AA</artist>
   </song>
</songs>
XML;

$index = 1; // (int)$_GET['song'];

$doc = new DOMDocument();
$doc->loadXml($xml);
$xpath = new DOMXPath($doc);

foreach ($xpath->evaluate('//song['.$index.']') as $song) {
  $song->parentNode->removeChild($song);
}

echo $doc->saveXml();

输出:

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

</songs>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-18
    • 2013-12-02
    • 2021-07-20
    相关资源
    最近更新 更多