2017-01-04 2 views
1

1: Ich möchte die Menge der Produkte in meiner XML-Datei erhalten. Ich dachte, ich kann das mit einem Zähler oder marker-> lenght tun. Aber es funktioniert nicht. Wie kann ich das lösen?Get XML "Länge" und zeigen, wenn Tag-Wert eine Zeichenfolge enthält? (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: Die zweite Frage ist, wie kann ich, wenn das Produkt überprüfen, und ich meine die URL und die Beschreibung, Schlüsselwörter wie „Dampf“ enthält?

3: Wie kann ich ein Kind an jedes Produkt anhängen und diesem Kind einen Wert geben?

XML, die ich geladen werden soll:

<?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> 

Die erste auf in meiner cronjob.php Klasse arbeiten. In dieser Klasse lade ich die XMLs herunter und benenne die Werte um. Ich mache immer ein DOMDocument wie folgt:

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

So dass ich kein Problem habe. Auch ich schließe und öffne meine XML-Datei wiederholt während des Cronjobs. Aber in der test.php Klasse ist er nicht die Datei öffnen, weil ich diese Fehlermeldung:

"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 

Ich weiß, dass PhpStorm mir sagen will, dass die XML-Datei nicht in UTF-8 ist. Aber das Seltsame ist, dass ich jedes Mal, wenn ich die XML-Datei öffne und sie schließe, kein Problem habe. Auch ist es sehr seltsam, dass die XML-Datei Zeichen wie "ä", "ö" und so weiter ...

Aber in Zeile 1423 zeigt die ich habe: W㥣hter Von Mittelerde (Notepad ++ View)

In Chrome Ich habe : Wächter Von Mittelerde

+0

Können Sie ein Beispiel für XML-Ziel zur Verfügung stellen? – Timurib

+0

Habe ich oben in der Frage! (jetzt) ​​ – Jan

+0

Ist die Frage gelöst? – Timurib

Antwort

1

: Diese arbeiten soll (proof), die Inhalte überprüfen, die in DOMDocument Instanz geladen.

Aber kein Grund, einen Knoten manuell zu durchlaufen: $marker->length sollte die benötigte Nummer enthalten.


: kann ich zwei Möglichkeiten vorschlagen:

a) Erhalten Liste aller product Knoten auswählen, die, was einen link oder desc Kind-Knoten mit entsprechenden nodeValue oder textContent hat:

/** 
* 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) Unter Verwendung XPath:

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

Der obige Ausdruck bedeutet: alle <link> und <desc> Elemente finden, wo Knotenwert einen „Dampf“ String enthält und dessen Elternknoten erhalten (<product>).


: Just appendChild() das Element jeden product gelten:

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

Vielen Dank, aber ich weiß jetzt, warum es nicht funktioniert ...! Siehe meine Antwort unten. Also kann ich Code hinzufügen – Jan

Verwandte Themen