使用 PHP 将新节点添加到每个具有变量作为属性的项目的 XML
Add new node to a XML on every item with a variable as attribute using PHP
我一直在用 PHP 做一些练习,我有一些关于如何使用 PHP 将新节点添加到每个带有变量作为属性的项目的 XML 的问题,我会详细解释的。
首先我加载了一个 XML 文件,其结构与下一个文件相似:
<?xml version="1.0" encoding="utf-8"?>
<products>
<item>
<reference>00001</reference>
<other_string>PRODUCT 1</other_string>
<brand>BRAND 1</brand>
<promo>YES</promo>
</item>
<item>
<reference>00002</reference>
<other_string>PRODUCT 2</other_string>
<brand>BRAND 2</brand>
<promo>YES</promo>
</item>
<item>
<reference>00003</reference>
<other_string>PRODUCT 3</other_string>
<brand>BRAND 3</brand>
<promo>NO</promo>
</item>
<item>
<reference>00004</reference>
<other_string>PRODUCT 4</other_string>
<brand>BRAND 4</brand>
<promo>NO</promo>
</item>
<item>
<reference>00005</reference>
<other_string>PRODUCT 5</other_string>
<brand>BRAND 5</brand>
<promo>YES</promo>
</item>
</products>
如您所见,XML 中有一个名为 <promo></promo>
的节点,其中包含 2 个可能的变量 "YES" 和 "NO",因此我需要基于此创建如果存在 "YES" 则包含“1”的新节点或如果 "NO" 则包含“0”的新节点看起来类似于:
<?xml version="1.0" encoding="utf-8"?>
<products>
<item>
<reference>00001</reference>
<other_string>PRODUCT 1</other_string>
<brand>BRAND 1</brand>
<promo>YES</promo>
<newnode>1</newnode>
</item>
<item>
<reference>00002</reference>
<other_string>PRODUCT 2</other_string>
<brand>BRAND 2</brand>
<promo>YES</promo>
<newnode>1</newnode>
</item>
<item>
<reference>00003</reference>
<other_string>PRODUCT 3</other_string>
<brand>BRAND 3</brand>
<promo>NO</promo>
<newnode>0</newnode>
</item>
<item>
<reference>00004</reference>
<other_string>PRODUCT 4</other_string>
<brand>BRAND 4</brand>
<promo>NO</promo>
<newnode>0</newnode>
</item>
<item>
<reference>00005</reference>
<other_string>PRODUCT 5</other_string>
<brand>BRAND 5</brand>
<promo>YES</promo>
<newnode>1</newnode>
</item>
</products>
我一直在玩这段代码,但它不能递归工作,而且似乎没有使用 xPath 检测值:
<?php
$sXML = simplexml_load_file('file.xml', null, LIBXML_NOBLANKS);
$promoyes = $sXML->xpath("//item[promo='YES']");
foreach ( $promoyes as $value ) {
$value = $sXML->item->addChild('newnode', '1');
}
unset($value);
$promono = $sXML->xpath("//item[promo='NO']");
foreach ( $promono as $value ) {
$value = $sXML->item->addChild('newnode', '0');
}
unset($value);
$domDocument = dom_import_simplexml($sXML)->ownerDocument;
$domDocument->formatOutput = true;
echo $domDocument->save('new.xml');
?>
任何帮助将不胜感激。
使用 DOMDocument
on its own. You can use getElementsByTagName
找到所有 promo
元素,然后添加一个 newnode
元素,其值基于 promo
的值,这最容易完成元素:
$doc = new DOMDocument();
$doc->loadXML($xml);
foreach ($doc->getElementsByTagName('promo') as $ele) {
$newnode = $doc->createElement('newnode');
$newnode->nodeValue = $ele->nodeValue == 'YES' ? 1 : 0;
$ele->parentNode->appendChild($newnode);
}
echo $doc->saveXML();
如您所知,所有节点都添加到第一个 <item>
节点 - 这取决于行...
$value = $sXML->item->addChild('newnode', '1');
当您从根节点开始并仅使用 ->item->
时,这将始终假设您要将新节点添加到第一个 <item>
元素。
您只需将节点添加到 $value
节点即可。我还将它简化为使用 1 个循环,它会选择任何带有 <promo>
元素的 <item>
元素(使用 //item[promo]
)。然后添加新节点并测试 <promo>
值...
$sXML = simplexml_load_file('file.xml', null, LIBXML_NOBLANKS);
$promo = $sXML->xpath("//item[promo]");
foreach ( $promo as $value ) {
$value->newnode = ($value->promo=='YES')? 1:0;
}
$domDocument = dom_import_simplexml($sXML)->ownerDocument;
$domDocument->formatOutput = true;
$domDocument->save('new.xml');
我一直在用 PHP 做一些练习,我有一些关于如何使用 PHP 将新节点添加到每个带有变量作为属性的项目的 XML 的问题,我会详细解释的。
首先我加载了一个 XML 文件,其结构与下一个文件相似:
<?xml version="1.0" encoding="utf-8"?>
<products>
<item>
<reference>00001</reference>
<other_string>PRODUCT 1</other_string>
<brand>BRAND 1</brand>
<promo>YES</promo>
</item>
<item>
<reference>00002</reference>
<other_string>PRODUCT 2</other_string>
<brand>BRAND 2</brand>
<promo>YES</promo>
</item>
<item>
<reference>00003</reference>
<other_string>PRODUCT 3</other_string>
<brand>BRAND 3</brand>
<promo>NO</promo>
</item>
<item>
<reference>00004</reference>
<other_string>PRODUCT 4</other_string>
<brand>BRAND 4</brand>
<promo>NO</promo>
</item>
<item>
<reference>00005</reference>
<other_string>PRODUCT 5</other_string>
<brand>BRAND 5</brand>
<promo>YES</promo>
</item>
</products>
如您所见,XML 中有一个名为 <promo></promo>
的节点,其中包含 2 个可能的变量 "YES" 和 "NO",因此我需要基于此创建如果存在 "YES" 则包含“1”的新节点或如果 "NO" 则包含“0”的新节点看起来类似于:
<?xml version="1.0" encoding="utf-8"?>
<products>
<item>
<reference>00001</reference>
<other_string>PRODUCT 1</other_string>
<brand>BRAND 1</brand>
<promo>YES</promo>
<newnode>1</newnode>
</item>
<item>
<reference>00002</reference>
<other_string>PRODUCT 2</other_string>
<brand>BRAND 2</brand>
<promo>YES</promo>
<newnode>1</newnode>
</item>
<item>
<reference>00003</reference>
<other_string>PRODUCT 3</other_string>
<brand>BRAND 3</brand>
<promo>NO</promo>
<newnode>0</newnode>
</item>
<item>
<reference>00004</reference>
<other_string>PRODUCT 4</other_string>
<brand>BRAND 4</brand>
<promo>NO</promo>
<newnode>0</newnode>
</item>
<item>
<reference>00005</reference>
<other_string>PRODUCT 5</other_string>
<brand>BRAND 5</brand>
<promo>YES</promo>
<newnode>1</newnode>
</item>
</products>
我一直在玩这段代码,但它不能递归工作,而且似乎没有使用 xPath 检测值:
<?php
$sXML = simplexml_load_file('file.xml', null, LIBXML_NOBLANKS);
$promoyes = $sXML->xpath("//item[promo='YES']");
foreach ( $promoyes as $value ) {
$value = $sXML->item->addChild('newnode', '1');
}
unset($value);
$promono = $sXML->xpath("//item[promo='NO']");
foreach ( $promono as $value ) {
$value = $sXML->item->addChild('newnode', '0');
}
unset($value);
$domDocument = dom_import_simplexml($sXML)->ownerDocument;
$domDocument->formatOutput = true;
echo $domDocument->save('new.xml');
?>
任何帮助将不胜感激。
使用 DOMDocument
on its own. You can use getElementsByTagName
找到所有 promo
元素,然后添加一个 newnode
元素,其值基于 promo
的值,这最容易完成元素:
$doc = new DOMDocument();
$doc->loadXML($xml);
foreach ($doc->getElementsByTagName('promo') as $ele) {
$newnode = $doc->createElement('newnode');
$newnode->nodeValue = $ele->nodeValue == 'YES' ? 1 : 0;
$ele->parentNode->appendChild($newnode);
}
echo $doc->saveXML();
如您所知,所有节点都添加到第一个 <item>
节点 - 这取决于行...
$value = $sXML->item->addChild('newnode', '1');
当您从根节点开始并仅使用 ->item->
时,这将始终假设您要将新节点添加到第一个 <item>
元素。
您只需将节点添加到 $value
节点即可。我还将它简化为使用 1 个循环,它会选择任何带有 <promo>
元素的 <item>
元素(使用 //item[promo]
)。然后添加新节点并测试 <promo>
值...
$sXML = simplexml_load_file('file.xml', null, LIBXML_NOBLANKS);
$promo = $sXML->xpath("//item[promo]");
foreach ( $promo as $value ) {
$value->newnode = ($value->promo=='YES')? 1:0;
}
$domDocument = dom_import_simplexml($sXML)->ownerDocument;
$domDocument->formatOutput = true;
$domDocument->save('new.xml');