1:我想获取XML文件中的产品数量。我以为我可以通过一个柜台或marker-> lenght
来做到这一点。但它没有用。我该如何解决?
$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:我的第二个问题是,我如何检查产品,我的意思是网址和描述是否包含像“steam”这样的关键字?
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');
所以我没有问题。此外,我在cronjob期间反复关闭并打开我的XML文件。但是在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 ++ View)
在Chrome中我有:Wächter Von Mittelerde
答案 0 :(得分:1)
1 :这应该有效(proof),检查加载到DOMDocument
实例的内容。
但没有理由手动遍历节点:$marker->length
应该包含所需的数字。
2 :我可以提出两种方法:
a)获取所有product
个节点的列表,并过滤具有相关nodeValue
或textContent
的link
或desc
个子节点的内容:
/**
* 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>
元素,其中节点值包含“steam”子字符串并获取其父节点(<product>
)
3 :只需将appendChild()
应用于每个product
元素:
foreach ($root->getElementsByTagName('product') as $productNode) {
$newElement = $dom->createElement('some-element-name', 'some value')
$productNode->appendChild($newElement);
}