Php 基于索引删除xml元素节点

Php 基于索引删除xml元素节点,php,arrays,xml,domdocument,Php,Arrays,Xml,Domdocument,我有一个包含许多元素的xml文件,我希望根据它们的索引删除某些元素 示例XML: <songs> <song> <title>A</title> <artist>AA</artist> </song> </songs> 在此问题上,任何帮助都将不胜感激,谢谢 $songs = $doc->getElementsByTagName('song'); $son

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

示例XML:

<songs>
   <song>
      <title>A</title>
      <artist>AA</artist>
   </song>
</songs>
在此问题上,任何帮助都将不胜感激,谢谢

$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));

等等。

如果您打算删除整个
元素。使用removeChild()->

如果您只需要一个简单的条件,按所需的键删除,那么只需使用
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);

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=parentNode->removeChild($song);
}
echo$doc->saveXml();
输出:

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

</songs>


您到底想取消设置什么?整个
?@Ghost是的,我正在尝试删除歌曲的整个歌曲子项。我也尝试过这样做,但虽然它消除了错误,但它并没有从xml文件中删除元素…感谢有关->removeChild()的提示。但我并不是想除掉我讨厌的艺术家。假设songs根元素中有30个歌曲元素。我只想根据索引删除其中一个。例如歌曲[14],歌曲[8],等等。我该怎么做?@SunnyD哦,好的,用foreach键就行了。但是请记住,这是从零开始的,所以第一首歌将在索引零上着陆。检查我的编辑。我以为你想删除你讨厌的歌曲/艺术家,lol@SunnyD我在我的修订版上添加了另一条信息,好吧,我想这是你删除的标准:D,无论如何,我很高兴这有帮助
// starts at index zero
$first_song = $doc->getElementsByTagName('song')->item(0);
$songs = $doc->documentElement;
$songs->removeChild($first_song);
$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>