- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在使用此 PHP 代码替换 XML 文件中的一系列节点:
<?php
$xml = "
<products>
<product>
<ItemId>531670</ItemId>
<modelNumber>METRA ELECTRONICS/MOBILE AUDIO</modelNumber>
<name>Buy</name>
<name>Car, Marine & GPS</name>
<name>Car Installation Parts</name>
<name>Deck Installation Parts</name>
<name>Antennas & Adapters</name>
</product>
<product>
<ItemId>531670</ItemId>
<modelNumber>METRA ELECTRONICS/MOBILE AUDIO</modelNumber>
<name>Buy</name>
<name>Car, Marine & GPS</name>
<name>Car Installation Parts</name>
<name>Deck Installation Parts</name>
<name>Antennas & Adapters</name>
</product>
<product>
<ItemId>531670</ItemId>
<modelNumber>METRA ELECTRONICS/MOBILE AUDIO</modelNumber>
<name>Buy</name>
<name>Car, Marine & GPS</name>
<name>Car Installation Parts</name>
<name>Deck Installation Parts</name>
<name>Antennas & Adapters</name>
</product>
<product>
<ItemId>531670</ItemId>
<modelNumber>METRA ELECTRONICS/MOBILE AUDIO</modelNumber>
<name>Buy</name>
<name>Car, Marine & GPS</name>
<name>Car Installation Parts</name>
<name>Deck Installation Parts</name>
<name>Antennas & Adapters</name>
</product>
<product>
<ItemId>531670</ItemId>
<modelNumber>METRA ELECTRONICS/MOBILE AUDIO</modelNumber>
<name>Buy</name>
<name>Car, Marine & GPS</name>
<name>Car Installation Parts</name>
<name>Deck Installation Parts</name>
<name>Antennas & Adapters</name>
</product>
</products>
";
function renameTags($xml, $old, $new)
{
$dom = new DOMDocument();
$dom->loadXML($xml);
$nodes = $dom->getElementsByTagName($old);
$toRemove = array();
foreach ($nodes as $node)
{
$newNode = $dom->createElement($new);
foreach ($node->attributes as $attribute)
{
$newNode->setAttribute($attribute->name, $attribute->value);
}
foreach ($node->childNodes as $child)
{
$newNode->appendChild($node->removeChild($child));
}
$node->parentNode->appendChild($newNode);
$toRemove[] = $node;
break;
}
foreach ($toRemove as $node)
{
$node->parentNode->removeChild($node);
}
$dom->formatOutput = TRUE;
return $dom->saveXML();
}
$xml = renameTags($xml, 'name', 'Source');
$xml = renameTags($xml, 'name', 'parentCategory');
$xml = renameTags($xml, 'name', 'Category');
$xml = renameTags($xml, 'name', 'subCategory');
$xml = renameTags($xml, 'name', 'sisterCategory');
echo $xml;
?>
但是,此代码仅替换且仅适用于一个产品集。我想我需要在由 foreach parentNode('product') 替换标签名称组成的函数中的某处调用 foreach 语句。我需要为迭代所有产品集的函数添加什么?
上面的代码将打印:(注意第一组名称节点已经不存在了,取而代之的是指定的新节点)
<?xml version="1.0"?>
<products>
<product>
<ItemId>531670</ItemId>
<modelNumber>METRA ELECTRONICS/MOBILE AUDIO</modelNumber>
<Source>Buy</Source>
<parentCategory>Car, Marine & GPS</parentCategory>
<Category>Car Installation Parts</Category>
<subCategory>Deck Installation Parts</subCategory>
<sisterCategory>Antennas & Adapters</sisterCategory></product>
<product>
<ItemId>531670</ItemId>
<modelNumber>METRA ELECTRONICS/MOBILE AUDIO</modelNumber>
<name>Buy</name>
<name>Car, Marine & GPS</name>
<name>Car Installation Parts</name>
<name>Deck Installation Parts</name>
<name>Antennas & Adapters</name>
</product>
<product>
<ItemId>531670</ItemId>
<modelNumber>METRA ELECTRONICS/MOBILE AUDIO</modelNumber>
<name>Buy</name>
<name>Car, Marine & GPS</name>
<name>Car Installation Parts</name>
<name>Deck Installation Parts</name>
<name>Antennas & Adapters</name>
</product>
<product>
<ItemId>531670</ItemId>
<modelNumber>METRA ELECTRONICS/MOBILE AUDIO</modelNumber>
<name>Buy</name>
<name>Car, Marine & GPS</name>
<name>Car Installation Parts</name>
<name>Deck Installation Parts</name>
<name>Antennas & Adapters</name>
</product>
<product>
<ItemId>531670</ItemId>
<modelNumber>METRA ELECTRONICS/MOBILE AUDIO</modelNumber>
<name>Buy</name>
<name>Car, Marine & GPS</name>
<name>Car Installation Parts</name>
<name>Deck Installation Parts</name>
<name>Antennas & Adapters</name>
</product>
</products>
如您所见,它只替换了一个产品实例。
最佳答案
foreach 中的中断是您的问题:它在第一个 <name>
处停止它遇到的节点,不管它在文档中的什么位置。
首先您必须遍历产品,然后遍历产品的 <name>
节点。类似于以下内容:
function renameTags($xml, $old, $new) {
$toRemove = array();
$dom = new DOMDocument();
$dom->loadXML($xml);
$products = $dom->getElementsByTagName('product');
foreach($products as $product) {
$nodes = $product->getElementsByTagName($old);
foreach ($nodes as $node) {
$newNode = $dom->createElement($new);
foreach ($node->attributes as $attribute) {
$newNode->setAttribute($attribute->name, $attribute->value);
}
foreach ($node->childNodes as $child) {
$newNode->appendChild($node->removeChild($child));
}
$node->parentNode->appendChild($newNode);
$toRemove[] = $node;
break;
}
}
foreach ($toRemove as $node) {
$node->parentNode->removeChild($node);
}
$dom->formatOutput = TRUE;
return $dom->saveXML();
}
关于每个父节点的 PHP replaceChild,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8416151/
我知道这是一个简单的概念,但我似乎无法让它发挥作用。任何想法为什么?这是我的代码: var oldChild = document.getElementById("sbX1"); var newChi
我有这个代码 function insertAfter(newNode, referenceNode) {
我正在自学 javascript,但不理解我从一些示例代码中获得的结果。为了简洁起见,我删减了代码。 html: firstChild and lastChild Property
在此先感谢您的帮助。所以在我的网站上,我在同一个 div 中有 2 张图片并排放置。我正在使用 replaceChild 来替换第一张图片。一切正常,但当它删除第一张图片时,第二张图片会在一瞬间向左移
我正在使用此 PHP 代码替换 XML 文件中的一系列节点: 531670 METRA ELECTRONICS/MOBILE AUDIO Buy Car, Marine & GPS Car
我是计算机科学专业的学生,我们正在用 javascript 做练习,练习是:“用 ID 为“numberFour”且文本为“Mistreatment”的新项目替换项目编号 4。” 这是我做练习之前
我正在尝试替换 xml 树的节点: QFile file("xml1.xml"); file.open(QFile::ReadOnly); QDomDocument xml; xml.setConte
考虑以下代码: $xml = XML; $partials['thisRegion'] = "Here's this region"; $partials['thatRegion'] = "H
这是我的函数的源代码: bool FieldModel::updateNode(QDomNode &node,const QString &parent){ QDomElement rootOfT
我是 javascript 的新手,发现了一个我今天无法解释的有趣行为。我有一个自定义 (带有图像)在一个网站上,在 IE7 及以下版本中显示奇怪。为了克服这个问题,我想使用 replaceChil
我正在尝试用我制作的新元素替换当前的 dom 元素。 我实现了以下行 $(this).parent().replaceChild(newElem,this); 但是它给出错误提示说 $(this).p
有没有一种简单的方法可以将它从 appendChild 更改为 replaceChild? 这当然会不断增加更多元素。同样出于某种原因,它没有将值放在 DIV 或 SPAN 中,似乎放在它下面。 va
我有 3 个并排的图像,我必须在它们下面放置 2 个按钮。单击前进,图像应向前移动并改变位置,然后向后移动,反之亦然。我试图用数组完成这项工作,但它没有响应。它只移动一次,无论是向前还是向后,单击一次
我正在尝试使用 powershell 和 xml 做一些非常简单的事情,但没有遇到任何麻烦。基本上我正在尝试采用以下 xml... 并按名称对机器元素进行排序。然后将它们放回 XML 中,以便我可以保
我正在使用以下代码更改输入类型 onfocus 并将其重置为文本 onblur。但这是行不通的 HTML JS function changeInputType(oldObject, oTyp
我正在尝试更新表格以在保存记录时显示新行。我的代码当前再次加载整个表以及现有表。例如,我看到第 1-15 行,然后添加一行并看到总共 31 行,第 1-15 行,然后是第 1-16 行都在同一个表中。
我正在动态生成一个表,然后我想将它作为子项附加到 div。问题是每次我重新生成表格时,它都会附加到同一个 div 中,而不会删除旧表格。 if(context.children.length == 0
我正在尝试替换 标记为 使用 Node.replaceChild 从 XHTML 字符串创建的 DOM 文档中的标记方法。两个标签具有相同的样式属性 style="color: blue;" ,但是当
我有一个 的列表元素: Item 1 Item 2 Item 3 我可以交换两个吗 元素 - 比如说 item1 和 item2 - 带有 replaceChild ,DOM树修改方
我正在为我的任务制作一份装箱单,我们可以选择任何地点和任何 3 件元素。应该发生的是用户按下 1、2 或 3 按钮,然后会出现一个提示,告诉用户他们想要用什么交换所选项目。然后,一旦他们点击确定,新项
我是一名优秀的程序员,十分优秀!