Как удалить в XML-документе определенный элемент в соответствии со значением дочернего элемента с помощью PHP

#php #xml

#php #xml

Вопрос:

Как мне удалить все элементы в XML-продукте, если значение элемента <onlineShopVisibility> равно notVisibleOnline ? Другими словами, мне нужно удалить все продукты, которые содержат <onlineShopVisibility>notVisibleOnline</onlineShopVisibility> и сохранить в новый файл.

 <response status="ok">
  <Product>
    <allowChangeOfPriceOnTheInvoice>true</allowChangeOfPriceOnTheInvoice>
    <allowChangeOfProductDescriptionOnTheInvoice>true</allowChangeOfProductDescriptionOnTheInvoice>
    <allowChangeOfVatRateOnTheInvoice>false</allowChangeOfVatRateOnTheInvoice>
    <costPosition />
    <currency>EUR</currency>
    <description>tralala ko imam</description>
    <exchangeRate>SlovenianBankMiddleRate</exchangeRate>
    <grossPrice>22.13</grossPrice>
    <isTrackedByLotNumbers>false</isTrackedByLotNumbers>
    <lastUpdateTimestamp>30.01.2021 17:07:34</lastUpdateTimestamp>
    <name>3D očala Philips PTA508</name>
    <onlineShopVisibility>notVisibleOnline</onlineShopVisibility>
    <procurementTransactionAccount>660000</procurementTransactionAccount>
    <productCode>3D OCALA 1</productCode>
    <productGroupPrimary />
    <productGroupSecondary />
    <retailPrice>27</retailPrice>
    <status>active</status>
    <trackItemsBySerialNumbers>false</trackItemsBySerialNumbers>
    <type>goodsWithStockManagement</type>
    <unit>kos</unit>
    <useOfPriceList>false</useOfPriceList>
    <vatPercentage>22</vatPercentage>
    <warrantyPeriod>0</warrantyPeriod>
  </Product>
  <Product>
    ...
    <onlineShopVisibility>VisibleOnline</onlineShopVisibility>
    ...
  </Product>
</response>
 

Код до сих пор:

 $toDelete = array ();
foreach ( $data1->Product as $item ) {
    $price = $item->onlineShopVisibility; 
    if ($price ="notVisibleOnline" ) { 
        $toDelete[] = $item; 
    } 
} 
foreach ($toDelete as $item) { 
    $dom = dom_import_simplexml($item); 
    $dom->parentNode->removeChild($dom); 
} 
echo $data1; 
file_put_contents('artikli.xml', $data1);
 

Комментарии:

1. Удалось ли вам добраться до загрузки XML-файла?

2. да, я не знаю, тогда еще раз удалите этот элемент

3. Что вы пробовали до сих пор? Покажите нам какой-нибудь код, который у вас уже есть, чтобы мы могли помочь вам его улучшить.

4. $price ="notVisibleOnline" присваивается значение, $price == "notVisibleOnline" выполняется сравнение

5. к сожалению, это тоже не работает, я тоже пробовал ===

Ответ №1:

Вы преобразуете каждый узел в DOM. Однако вы можете использовать DOM напрямую.

 // bootstrap the DOM 
$document = new DOMDocument();
$document->load($xmlFile);

// fetch nodes using an xpath expression 
$xpath = new DOMXpath($document);
$products = $xpath->evaluate('//Product[onlineShopVisibility="notVisibleOnline"]');

// iterate nodes
foreach ($products as $product) {
    // remove node
    $product->parentNode->removeChild($product);
}

$document->save($xmlFile);
 

Ответ №2:

Помимо изменения с = на == ,

 if ($price == "notVisibleOnline" ) {
 

вам также необходимо сохранить файл в качестве источника $data1 использования asXML() в тот момент, когда вы пытаетесь записать объект…

 file_put_contents('artikli.xml', $data1->asXML());
 

Комментарии:

1. если я использую, я получаю ошибку 500, и она не создает файл, в противном случае она создает файл для меня, но со всеми элементами мой файл составляет 12 МБ

2. Вам нужно будет выяснить, что говорит об ошибке, на данный момент мне трудно понять, что происходит сбой.