加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

php只追加5个子节点中的3个

发布时间:2020-12-13 16:22:56 所属栏目:PHP教程 来源:网络整理
导读:此代码仅附加5个名称节点中的3个.这是为什么? 这是原始的 XML: 它有5个名称节点. ?xml version='1.0'?productsproductitemId531670/itemIdmodelNumberMETRA ELECTRONICS/MOBILE AUDIO/modelNumbercategoryPathcategorynameBuy/name/categorycategorynameCa
此代码仅附加5个名称节点中的3个.这是为什么?
这是原始的 XML:
它有5个名称节点.

<?xml version='1.0'?>
<products>
<product>
<itemId>531670</itemId>
<modelNumber>METRA ELECTRONICS/MOBILE AUDIO</modelNumber>
<categoryPath>
<category><name>Buy</name></category>
<category><name>Car,Marine &amp; GPS</name></category>
<category><name>Car Installation Parts</name></category>
<category><name>Deck Installation Parts</name></category>
<category><name>Antennas &amp; Adapters</name></category>
</categoryPath>
</product>

</products>

然后运行这个PHP代码.禁止将所有名称节点附加到产品节点中.

<?php

// load up your XML
$xml = new DOMDocument;
$xml->load('book.xml');

// Find all elements you want to replace. Since your data is really simple,// you can do this without much ado. Otherwise you could read up on XPath.
// See http://www.php.net/manual/en/class.domxpath.php
//$elements = $xml->getElementsByTagName('category');

// WARNING: $elements is a "live" list -- it's going to reflect the structure
// of the document even as we are modifying it! For this reason,it's
// important to write the loop in a way that makes it work correctly in the
// presence of such "live updates".


foreach ($xml->getElementsByTagName('product') as $product ) {
foreach($product->getElementsByTagName('name') as $name ) {
    $product->appendChild($name );
}
$product->removeChild($xml->getElementsByTagName('categoryPath')->item(0));
}

// final result:
$result = $xml->saveXML();
echo $result;
?>

最终结果是这个,它只附加3个名称节点:

<?xml version="1.0"?>
<products>
<product>
<itemId>531670</itemId>
<modelNumber>METRA ELECTRONICS/MOBILE AUDIO</modelNumber>
<name>Buy</name>
<name>Antennas &amp; Adapters</name>
<name>Car Installation Parts</name>
</product>
</products>

为什么它只附加3个名称节点?

解决方法

您可以在追加它们之前临时将名称元素添加到数组中,因为您实时修改了DOM. getElementsByTagName()生成的节点列表可能会随着您移动节点而改变(事实上,这似乎正在发生的事情).

<?php

// load up your XML
$xml = new DOMDocument;
$xml->load('book.xml');    

// Array to store them
$append = array();
foreach ($xml->getElementsByTagName('product') as $product ) {
foreach($product->getElementsByTagName('name') as $name ) {
  // Stick $name onto the array
  $append[] = $name;
}
// Now append all of them to product
foreach ($append as $a) {
    $product->appendChild($a);
}

$product->removeChild($xml->getElementsByTagName('categoryPath')->item(0));
}

// final result:
$result = $xml->saveXML();
echo $result;
?>

输出,附加所有值:

<?xml version="1.0"?>
<products>
<product>
<ItemId>531670</ItemId>
<modelNumber>METRA ELECTRONICS/MOBILE AUDIO</modelNumber>

<name>Buy</name><name>Car,Marine &amp; GPS</name><name>Car Installation Parts</name><name>Deck Installation Parts</name><name>Antennas &amp; Adapters</name></product>

</products>

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读