2017-02-19 3 views
1

Я написал функцию, которая удаляет все узлы <product>...</product>, где заголовок не соответствует одному заголовку в моем фильтре массива заголовков.Один XML-файл правильный, другой уничтожен? - Те же функции? (PHP)

Моя проблема в том, что 4 файла XML будет сохранен и модифицирован право, а также сохранен, но один XML-файл становится полностью разрушен ...

После того как я назвал эту функцию на этом XML-листе я просто вижу:

<?xml version="1.0" encoding="utf-8"?> 
<products/> 

Перед изменением:

<?xml version="1.0" encoding="utf-8"?> 
<products> 
    <product> 
    <title>METRO</title> 
    <price>10.99</price> 
    <platform>Steam</platform> 
    </product> 
    <product> 
    <title>XBOX Live Gold</title> 
    <price>46.99</price> 
    <platform>Xbox</platform> 
    </product> 
</products> 

Это моя функция:

function filterGames($dom){ 
    $xpathQuery = "/products/product"; 
    $xp = new DomXpath($dom); 
    $items = $xp->query($xpathQuery); 

    echo "(filterGames) Delete Games\n"; 

    foreach ($items as $item) { 
     $title = $item->getElementsByTagName('title')->item(0)->textContent; 
     if (!(array_search(mb_strtolower($title), array_map('mb_strtolower', $GLOBALS["titleArray"])))) { 
     //if (!(in_array($title, $GLOBALS["titleArray"]))) { 
      $item->parentNode->removeChild($item); 
      echo "Removed: " . $title ."\n"; 
     } 
    } 
} 

У кого-нибудь есть идея, почему 4 файла XML сохраняются и изменяются правильно, но один файл полностью уничтожен?

Я также изменил порядок, в котором файлы XML модифицируются фильтром, но он не внес изменений. Опять же, остальные 4 файла сохраняются и изменяются правильно, но один из них уничтожен. И это всегда один и тот же файл XML, который уничтожается!

Я также вхожу в условие if, потому что вижу это с echo. Но в любом случае ... Файл уничтожен.

Edit: Вот два примера из моих XML-листов до и после того, как модифицируется filterGames. Они выглядят точно так же, как разрушенный файл XML, прежде чем модифицированный filterGames

XML File 1 перед модифицирована:

<?xml version="1.0" encoding="UTF-8"?> 
<products> 
    <product> 
    <price>11.69</price> 
    <price_base>12.99</price_base> 
    <title>Final Fantasy VII</title> 
    </product> 
<products> 

XML File 1 после того, как модифицированном выглядит точно так же бувигер модификации, за исключением, что некоторые узлы были удалить, потому что они не соответствуют фильтру $GLOBALS["titleArray"].

XML File 2 до того изменения:

<products> 
    <product> 
    <title>Battlefield 2</title> 
    <price>5.95</price> 
    </product> 
<products> 

XML File 2 после того, как модифицирован выглядит точно как бувигер модификации, за исключением, что некоторые узлы были удалить, потому что они не соответствуют по $GLOBALS["titleArray"] фильтра.


Я нашел интересный факт! Мой XML-файл, который уничтожается после фильтрации filterGames(), тем временем не является единственным файлом XML, который уничтожается. И оба файла, где конвертируются мои csvToXML(...), работают от CSV до XML. Поэтому я думаю, что причина должна быть такой! - Потому что все другие файлы XML не преобразуются!

function csvToXML($inputFilename, $outputFilename, $delimiter = ',') 
{ 
    // Open csv to read 
    $inputFile = fopen($inputFilename, 'rt'); 

    // Get the headers of the file 
    $headers = fgetcsv($inputFile, 0, $delimiter); 

    // Create a new dom document with pretty formatting 
    $doc = new DOMDocument('1.0', 'utf-8'); 
    $doc->preserveWhiteSpace = false; 
    $doc->formatOutput = true; 

    // Add a root node to the document 
    $root = $doc->createElement('products'); 
    $root = $doc->appendChild($root); 

    // Loop through each row creating a <row> node with the correct data 
    while (($row = fgetcsv($inputFile, 0, $delimiter)) !== false) { 
    $container = $doc->createElement('product'); 
    foreach ($headers as $i => $header) { 
     $child = $doc->createElement($header); 
     $child = $container->appendChild($child); 
     $value = $doc->createTextNode($row[$i]); 
     $value = $child->appendChild($value); 
    } 

    $root->appendChild($container); 
    } 

    $strxml = $doc->saveXML(); 
    $handle = fopen($outputFilename, 'w'); 
    fwrite($handle, $strxml); 
    fclose($handle); 
} 
+1

Каково значение в $ GLOBALS ["titleArray"]? Также вы можете добавить другой рабочий файл xml, который работает. –

+0

Функция, которую вы видите там 'filterGames()', есть функция в моем файле function.php. Существуют и другие объявленные функции, и потому, что мне нужны некоторые переменные в разных функциях, я решил сделать их Global в моей функции.php. Не беспокойтесь об этом! Я добавлю еще 2 примера. Но не удивляйтесь. Они выглядят точно так же, как уничтоженный XML-файл, прежде чем изменять! – Jan

ответ

1

Вот пример того, как он должен работать:

<?php 

function filterGames($dom) { 
    $xpathQuery = "/products/product"; 
    $xp = new DOMXpath($dom); 
    $items = $xp->query($xpathQuery); 

    // convert the array since this can be one time 
    $titles = array_map('mb_strtolower', $GLOBALS['titleArray']); 

    // loop over the products in the xml 
    foreach ($items as $item) { 
     // convert the title to lowercase 
     $title = mb_strtolower($item->getElementsByTagName('title')->item(0)->textContent); 

     // check if the title is not in the array of titles 
     // if not in the arr, then remove it 
     if(!in_array($title, $titles)) { 
      $item->parentNode->removeChild($item); 
      echo "Removed: " . $title ."\n"; 
      // there needs to be a save call here 
     } 
    } 
} 

// array of titles 
$GLOBALS['titleArray'] = array("METRO"); 

// load the xml document 
$dom = new DOMDocument(); 
$dom->load("input.xml"); 

// call the function 
filterGames($dom); 

Проблема заключается в том, что array_search() возвращает ключ, а не логическое. Поэтому, если ключ равен> = 1, он будет преобразован в true, а что-то еще будет ложным.Таким образом, были, вероятно, ложные срабатывания, вызывающие удаление продуктов.

+0

Я проверю его за несколько часов :) – Jan

+0

Еще один вывод ...:/- Я не вижу ошибки ... Есть ли другой способ? - Простой XML или DOM? – Jan

+0

Ошибка отсутствует. Я изменил инструкцию if для использования 'in_array()' вместо 'array_search()'. 'array_search()' возвращает первый успешный ключ, если найден. Вот что вызывает разные результаты. Вы должны изменить его, чтобы использовать 'in_array()', который вернет логическое значение для оператора if. –

Смежные вопросы