2017-01-04 6 views
1

1: Я хочу получить количество продуктов в файле XML. Я думал, что могу сделать это с помощью счетчика или marker-> lenght. Но он не работает. Как я могу это решить?Получите XML "lenght" и покажите, имеет ли значение тега строку? (PHP)

$gamesplanetPath = 'data/gamesplanet.xml'; 
$kinguinPath = 'data/kinguin.xml'; 
$onlinekeystorePath = 'data/onlinekeystore.xml'; 
$g2aPath = 'data/g2a.xml'; 

function countAd($gamesplanetPath){ 
    $dom = new DOMDocument('1.0', 'utf-8'); 
    $dom->preserveWhiteSpace = false; 
    $dom->formatOutput = true; 
    $dom->load($gamesplanetPath); 

    $counter = 0; 
    $root = $dom->documentElement; 

    $marker = $root->getElementsByTagName('name'); 
    for($i = $marker->length - 1; $i >= 0 ; $i--){ 
     $counter = $counter + 1 ; 
    } 

    echo "Products: " . $counter ."\n"; 
} 

2: Мой второй вопрос, как я могу проверить, если продукт, и я имею в виду URL и описание, содержит ключевое слово, как «пара»?

3: Как я могу добавить ребенка к каждому продукту и дать этому ребенку значение?

XML, который я хочу, чтобы загрузить:

<?xml version="1.0" encoding="UTF-8"?> 
    <products> 
     <product> 
     <name>Final Fantasy VII</name> 
     <desc>Den Rollenspiel-Klassiker FINAL FANTASY VII gibt es jetzt für den PC, mit brandneuen Online-Features!</desc> 
     <price>11.69</price> 
     <price_base>12.99</price_base> 
     <link>https://de.gamesplanet.com/game/final-fantasy-vii-download--1001-1</link> 
     <publisher>Eidos - Square Enix</publisher> 
     <category>RPG (Rollenspiel)</category> 
     <ean/> 
     <packshot>https://de.gamesplanet.com/acache/10/01/1/de/packshot-770bf6d03800b87dc0f9509f21e8d423.jpg</packshot> 
     </product> 

Первый на работает в моем классе cronjob.php. В этом классе я загружаю XML и переименовываю значения. Я всегда делаю DOMDocument следующим образом:

$dom = new DOMDocument('1.0', 'utf-8'); 

Так что у меня нет проблем. Также я закрываю и снова открываю свой XML-файл во время cronjob. Но в классе test.php он не открывает файл, потому что я получаю это сообщение об ошибке:

"D:\Anwendung\PHP 7\php-win.exe" C:\Users\Jan\PhpstormProjects\censored\test.php 
PHP Warning: DOMDocument::load(): Input is not proper UTF-8, indicate encoding ! 
Bytes: 0xE3 0xA4 0x63 0x68 in file:/C:/Users/Jan/PhpstormProjects/censored/data/gamesplanet.xml, line: 1423 in C:\Users\Jan\PhpstormProjects\censored\test.php on line 18 
PHP Fatal error: Uncaught Error: Call to a member function getElementsByTagName() on null in C:\Users\Jan\PhpstormProjects\censored\test.php:23 
Stack trace: 
#0 C:\Users\Jan\PhpstormProjects\censored\test.php(86): countAd('data/gamesplane...') 
#1 {main} 
    thrown in C:\Users\Jan\PhpstormProjects\censored\test.php on line 23 

Process finished with exit code 255 

Я знаю, что PhpStorm хочет мне сказать, что файл XML не в UTF-8. Но странно, что каждый раз, когда я открываю XML-файл и закрываю его, у меня нет проблем. И очень странно, что файл XML показывает символы, такие как «А», «ö» и так далее ...

Но в строке 1423 у меня есть: W㥣hter Von Mittelerde (Notepad ++) Посмотреть

В Chrome у меня есть : Wächter Von Mittelerde

+0

Можете ли вы предоставить пример целевой XML? – Timurib

+0

Был ли я выше в вопросе! (сейчас) – Jan

+0

Решен ли вопрос? – Timurib

ответ

1

: Это должно работать (proof), проверить содержимое, которое загружается в DOMDocument экземпляра.

Но нет причин для ручного перемещения узлов: $marker->length должен содержать нужный номер.


: Я могу предложить два способа:

а) Получить список всех product узлов и отфильтровывать те, что имеют link или desc дочерние узлы с соответствующими nodeValue или textContent:

/** 
* Simple helper to test a node contents: 
*/ 
function isSteamProduct(DOMNode $productNode, string $tag): bool 
{ 
    $node = $productNode->getElementsByTagName($tag)->item(0); 
    return strpos($node->nodeValue, 'steam') !== false; 
} 

... 

foreach ($root->getElementsByTagName('product') as $productNode) { 
    if (isSteamProduct($productNode, 'link') || isSteamProduct($productNode, 'desc')) { 
     echo "Product URL or description contains 'steam' word"; 
    } 
} 

b) Использование XPath:

$xpath = new DOMXPath($dom); 
$xpath->query("//link[contains(text(), 'steam')]/..|//desc[contains(text(), 'steam')]/..")); 

Выражение выше означает: найти все <link> и <desc> элементы, где значение узла содержит «пар» подстроку и получить их родительские узлы (<product>).


: Просто нанесите appendChild() к каждому элементу product:

foreach ($root->getElementsByTagName('product') as $productNode) { 
    $newElement = $dom->createElement('some-element-name', 'some value') 
    $productNode->appendChild($newElement); 
} 
+0

Большое вам спасибо, но теперь я знаю, почему он не работает ...! См. Мой ответ ниже. Поэтому я могу добавить код – Jan