Удалите все элементы из XML, которые соответствуют определенным строкам в узле с PHP - PullRequest
0 голосов
/ 15 марта 2019

Мне нужно удалить некоторые элементы, которые соответствуют определенным строкам в XML, используя PHP, я думаю, что я могу сделать это с 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 3 и BRAND 4" на <brand></brand>пометить и получить 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>

Любая помощь будет высоко оценен.

Ответы [ 2 ]

1 голос
/ 15 марта 2019

Снова используя 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'] просто ищет любые *Элемент 1005 *, который имеет элемент <brand>, который содержит BRAND 3 или BRAND 4. Затем он перебирает совпадения и удаляет их.Использование $item[0] - выдумка для сброса XML-элемента вместо сброса используемой переменной.

0 голосов
/ 15 марта 2019

Самое сложное - это удалить элементы. Поэтому вы можете посмотреть на этот ответ

сначала получите все бренды с 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());
...