Probleme mit Google Shopping Export

Wer wie ich mal vor dem Problem steht, dass der Google Export Feed mit Fehlermeldung und ohne Feed Generierung abbricht, der Sucht sich nach dem Warum halb tot. In meinem Fall wurde zwar die Quelle des Fehlers angegeben (PCDATA invalid Char value 7\n“,„file“:„“,„line“:3223},), doch es brachte mir nichts, da ja wie erwähnt kein Feed erstellt wurde. Ich konnte den Fehler zwar eingrenzen, indem ich aus dem Template solange Abfragekriterien entfernte, bis ich schliesslich feststellen konnte, dass der Fehler irgendwo in der Produktebeschreibung sein musste. Doch bei über 500 Artikeln hätte ich jede einzelne Produktebeschreibung manuell durchsehen müssen. Es musste also ein anderer Weg hin. Der Feed wurde ja offenbar kurz generiert, weshalb auch auf die Line 3223 verwiesen wurde. Doch wenn dies nur im Speicher (RAM) geschieht, nützt mir das nicht viel. Also habe ich die für den Feed verantwortliche php Datei entsprechend angepasst, damit mir diese den fehlerhaften Feed abspeichert.

Und das geht so:
Öffne die Datei: /htdocs/vendor/shopware/core/Content/ProductExport/Validator/XmlValidator.php

Sucht:

 if (!simplexml_load_string($productExportContent)) {
            $errors->add(new XmlValidationError($productExportEntity->getId(), libxml_get_errors()));

         }

und ergänzt gleich danach:

        // Save the incomplete feed content
            $logFilePath = __DIR__ . '/feed.log';
            file_put_contents($logFilePath, $productExportContent . PHP_EOL);

Speichert die Datei und führt den Feed erneut aus, indem ihr die Link URL kopiert und im Browser einfach ausführt.

Neu wird nun unter: /htdocs/vendor/shopware/core/Content/ProductExport/Validator/
die Datei „feed.log“ angelegt. Öffnet diese Datei am besten mit einem Editor wie Notepad++ welcher die Zeilen nummeriert. Sucht nun die fehlerhafte Zeilennummer und korrigiert den Fehler im jeweiligen Produkt. Die Datei wird übrigens nur im Fehlerfall angelegt. In meinem Fall war es folgendes Zeichen, welches ich in einer Produktebeschreibung hatte:
Fehler

Ich hoffe meine Erkenntnis hilft auch anderen weiter. :slight_smile:

1 „Gefällt mir“

Sehr geil, danke dir. Damit konnte ich die Stelle direkt ausfindig machen!

1 „Gefällt mir“

Freut mich sehr, dass mein Beitrag geholfen hat. :+1:

Guten Morgen, kannst Du mir bitte mal die XmlValidator.php zeigen wie die fertig, also inkl. deiner Zeile aussieht? Kommen die Zeilen nach dem „}“ oder in die geschweifte Klammern Sorry, bin da nicht so nah am Thema :frowning:

Wäre das so korrekt?

if (!simplexml_load_string($productExportContent)) {
            $errors->add(new XmlValidationError($productExportEntity->getId(), libxml_get_errors()));
// Save the incomplete feed content 04_09_2024
            $logFilePath = __DIR__ . '/feed.log';
            file_put_contents($logFilePath, $productExportContent . PHP_EOL);

        }

Ja, der Code ist korrekt und die eingefügten Zeilen müssen innerhalb der geschweiften Klammern stehen, damit sie nur dann ausgeführt werden, wenn der simplexml_load_string-Check fehlschlägt.

Hier noch meine XmlValidator.php

<?php declare(strict_types=1);

namespace Shopware\Core\Content\ProductExport\Validator;

use Shopware\Core\Content\ProductExport\Error\ErrorCollection;
use Shopware\Core\Content\ProductExport\Error\XmlValidationError;
use Shopware\Core\Content\ProductExport\ProductExportEntity;
use Shopware\Core\Framework\Log\Package;

#[Package('inventory')]
class XmlValidator implements ValidatorInterface
{
    public function validate(ProductExportEntity $productExportEntity, string $productExportContent, ErrorCollection $errors): void
    {
        if ($productExportEntity->getFileFormat() !== ProductExportEntity::FILE_FORMAT_XML) {
            return;
        }

        $backup_errors = libxml_use_internal_errors(true);

        if (!simplexml_load_string($productExportContent)) {
            $errors->add(new XmlValidationError($productExportEntity->getId(), libxml_get_errors()));
        }

        libxml_use_internal_errors($backup_errors);
    }
}