从 XML 中删除与 PHP 节点中的特定字符串匹配的所有元素
Remove all elements from XML that match specific strings in a node with PHP
我需要使用 PHP 删除与 XML 上的特定字符串匹配的一些元素,我想我可以使用 DOM 来完成此操作,因为我一直在阅读。问题来自使用多个字符串。
我有这个XML:
<?xml version="1.0" encoding="utf-8"?>
<products>
<item>
<reference>00001</reference>
<other_string>PRODUCT 1</other_string>
<brand>BRAND 1</brand>
</item>
<item>
<reference>00002</reference>
<other_string>PRODUCT 2</other_string>
<brand>BRAND 2</brand>
</item>
<item>
<reference>00003</reference>
<other_string>PRODUCT 3</other_string>
<brand>BRAND 3</brand>
</item>
<item>
<reference>00004</reference>
<other_string>PRODUCT 4</other_string>
<brand>BRAND 4</brand>
</item>
<item>
<reference>00005</reference>
<other_string>PRODUCT 5</other_string>
<brand>BRAND 5</brand>
</item>
</products>
并且我需要删除与 <brand></brand>
标签上的字符串 "BRAND 3 and BRAND 4" 匹配的元素,并得到一个类似于此
的 XML
<?xml version="1.0" encoding="utf-8"?>
<products>
<item>
<reference>00001</reference>
<other_string>PRODUCT 1</other_string>
<brand>BRAND 1</brand>
</item>
<item>
<reference>00002</reference>
<other_string>PRODUCT 2</other_string>
<brand>BRAND 2</brand>
</item>
<item>
<reference>00005</reference>
<other_string>PRODUCT 5</other_string>
<brand>BRAND 5</brand>
</item>
</products>
任何帮助将不胜感激。
最难的部分是删除元素。因此你可以看看 this answer
首先获取所有带有xPath('//brand')
的品牌。然后删除符合您的过滤规则的项目。
$sXML = simplexml_load_string($xml);
$brands = $sXML->xPath('//brand');
function filter(string $input) {
switch ($input) {
case 'BRAND 3':
case 'BRAND 4':
return true;
default:
return false;
}
}
array_walk($brands, function($brand) {
$content = (string) $brand;
if (filter($content)) {
$item = $brand->xPath('..')[0];
unset($item[0]);
}
});
var_dump($sXML->asXML());
再次使用 XPath,但这次也用它来过滤您之后的节点,然后删除它们...
$xml = simplexml_load_file("data.xml");
$remove = $xml->xpath("//item[brand='BRAND 3' or brand='BRAND 4']");
foreach ( $remove as $item ) {
unset($item[0]);
}
XPath //item[brand='BRAND 3' or brand='BRAND 4']
只是在寻找任何 <item>
元素,其中 <brand>
元素包含 BRAND 3 或 BRAND 4。然后循环匹配并删除它们。使用 $item[0]
是取消设置 XML 元素而不是取消设置正在使用的变量的软糖。
我需要使用 PHP 删除与 XML 上的特定字符串匹配的一些元素,我想我可以使用 DOM 来完成此操作,因为我一直在阅读。问题来自使用多个字符串。
我有这个XML:
<?xml version="1.0" encoding="utf-8"?>
<products>
<item>
<reference>00001</reference>
<other_string>PRODUCT 1</other_string>
<brand>BRAND 1</brand>
</item>
<item>
<reference>00002</reference>
<other_string>PRODUCT 2</other_string>
<brand>BRAND 2</brand>
</item>
<item>
<reference>00003</reference>
<other_string>PRODUCT 3</other_string>
<brand>BRAND 3</brand>
</item>
<item>
<reference>00004</reference>
<other_string>PRODUCT 4</other_string>
<brand>BRAND 4</brand>
</item>
<item>
<reference>00005</reference>
<other_string>PRODUCT 5</other_string>
<brand>BRAND 5</brand>
</item>
</products>
并且我需要删除与 <brand></brand>
标签上的字符串 "BRAND 3 and BRAND 4" 匹配的元素,并得到一个类似于此
<?xml version="1.0" encoding="utf-8"?>
<products>
<item>
<reference>00001</reference>
<other_string>PRODUCT 1</other_string>
<brand>BRAND 1</brand>
</item>
<item>
<reference>00002</reference>
<other_string>PRODUCT 2</other_string>
<brand>BRAND 2</brand>
</item>
<item>
<reference>00005</reference>
<other_string>PRODUCT 5</other_string>
<brand>BRAND 5</brand>
</item>
</products>
任何帮助将不胜感激。
最难的部分是删除元素。因此你可以看看 this answer
首先获取所有带有xPath('//brand')
的品牌。然后删除符合您的过滤规则的项目。
$sXML = simplexml_load_string($xml);
$brands = $sXML->xPath('//brand');
function filter(string $input) {
switch ($input) {
case 'BRAND 3':
case 'BRAND 4':
return true;
default:
return false;
}
}
array_walk($brands, function($brand) {
$content = (string) $brand;
if (filter($content)) {
$item = $brand->xPath('..')[0];
unset($item[0]);
}
});
var_dump($sXML->asXML());
再次使用 XPath,但这次也用它来过滤您之后的节点,然后删除它们...
$xml = simplexml_load_file("data.xml");
$remove = $xml->xpath("//item[brand='BRAND 3' or brand='BRAND 4']");
foreach ( $remove as $item ) {
unset($item[0]);
}
XPath //item[brand='BRAND 3' or brand='BRAND 4']
只是在寻找任何 <item>
元素,其中 <brand>
元素包含 BRAND 3 或 BRAND 4。然后循环匹配并删除它们。使用 $item[0]
是取消设置 XML 元素而不是取消设置正在使用的变量的软糖。