错误的 XML 文件编码(æ、ø、å 字母)- 如何正确编码产品源

问题描述 投票:0回答:1

我正在制作一个 WordPress 插件,该插件应该加载 2 种类型的 XML 文件(产品提要文件),然后找到库存状态字段,然后保留所有库存产品并从这些 XML 产品返回库存产品 URL 列表饲料。

我已经对库存状态字段可以采用的所有可能的库存值进行了硬编码,到目前为止,这些值只有“有库存”、“有库存”、“是”和大于 0 的值。但是在新产品 Feed 中我刚刚补充说,库存价值是“På lager”。我认为我可以将这个新值添加到我的函数中(在我对值进行硬编码的部分),但这不起作用。

我已经尝试了一切(与 ChatGPT 进行了 8 小时的对话,我尝试使用

mb_convert_encoding
和其他类型的技巧),但没有任何帮助......我也尝试回显这些值,并查看我的插件输出的值(即“På lager”),但我无法将其解码为“på lager”。

我不知道这是否与 XML 的编码有关或完全不同。我真的希望有人能帮助我......

我已附上我的功能代码,并且我已附上新产品提要的示例。

功能:

function fetch_and_parse_product_feed_with_xmlreader($feed_entry) {
    $reader = new XMLReader();
    // Access the 'url' key from the feed entry
    if (!$reader->open($feed_entry['url'])) {
        echo "<p>Failed to open feed: " . esc_url($feed_entry['url']) . "</p>";
        return array();
    }

    $in_stock_products = array();
    while ($reader->read()) {
        if ($reader->nodeType == XMLReader::ELEMENT) {
            if ($reader->localName == 'produkt') {
                // Handling for Feed type 1
                $productXml = $reader->readOuterXML();
                $product = simplexml_load_string($productXml);
                $stock_status = strtolower((string)$product->lagerantal);
                if ($stock_status === 'instock' || $stock_status === 'in stock' || intval($stock_status) > 0 || $stock_status === 'yes' || $stock_status === 'på lager') {
                    $processed_url = process_url_for_comparison((string)$product->vareurl);
                    $in_stock_products[] = $processed_url;
                }
            } elseif ($reader->localName == 'product') {
                // Handling for Feed type 2
                $productXml = $reader->readOuterXML();
                $product = simplexml_load_string($productXml);
                $stock_status = strtolower((string)$product->Instock);
                if ($stock_status === 'instock' || $stock_status === 'in stock' || intval($stock_status) > 0 || $stock_status === 'yes') {
                    $processed_url = process_url_for_comparison((string)$product->TrackingUrl);
                    $in_stock_products[] = $processed_url;
                }
            }
        }
    }

    $reader->close();
    return $in_stock_products;
}

XML 产品提要:

<?xml version="1.0" encoding="iso-8859-1"?>
<produkter>
<produkt>
<forhandler>Cykelpartner</forhandler>
<kategorinavn>Rullebremser &amp; fodbremser</kategorinavn>
<brand>Shimano</brand>
<produktnavn>Shimano Nexus - Skrue og møtrik for bremsewire ved rullebremser bag - BR-IM45-R</produktnavn>
<produktid>4524667690467</produktid>
<ean>4524667690467</ean>
<beskrivelse>Original øjebolt med møtrik der anvendes til fastgørelse af bremsewiren på en Shimano Nexus rullebremse i bag model BR-I...</beskrivelse>
<nypris>24.00</nypris>
<glpris>24.00</glpris>
<fragtomk>45</fragtomk>
<lagerantal>På lager</lagerantal>
<leveringstid>1-3 dage</leveringstid>
<size></size>
<color></color>
<billedurl>https://resources.chainbox.io/cykelpartner/public/pim/0cdd0111-b47f-44f7-8099-54fa6dd278aa/Y8JK98050_A_default.jpg</billedurl>
<vareurl>https://www.partner-ads.com/dk/klikbanner.php?bannerid=16446&amp;partnerid=16025&amp;htmlurl=https://www.cykelpartner.dk/rullebremser-shimano-nexus-og-dele/shimano-nexus---skrue-og-moetrik-for-bremsewire-ved-rullebremser-bag---br-im45-r</vareurl>
</produkt>
<produkt>
<forhandler>Cykelpartner</forhandler>
<kategorinavn>Bremsegreb</kategorinavn>
<brand>Shimano</brand>
<produktnavn>Shimano GRX - STI greb Højre - ST-RX820 - Til 12 gears kassetter - Hydraulisk</produktnavn>
<produktid>4550170173432</produktid>
<ean>4550170173432</ean>
<beskrivelse>Dette STI skifte- og bremsegreb fra Shimanos GRX gravel 12 gears serie, tilhører den kvalitetsmæssige top. Grebet er model ST-RX820, o...</beskrivelse>
<nypris>2349.00</nypris>
<glpris>2349.00</glpris>
<fragtomk>0</fragtomk>
<lagerantal>Ikke på lager</lagerantal>
<leveringstid>Ukendt leveringstid</leveringstid>
<size></size>
<color></color>
<billedurl>https://resources.chainbox.io/5/cykelpartner/public/pim/bb10bd81-d2af-401d-a50c-ed5f3adcc159/istrx820rbi_a_default.jpg</billedurl>
<vareurl>https://www.partner-ads.com/dk/klikbanner.php?bannerid=16446&amp;partnerid=16025&amp;htmlurl=https://www.cykelpartner.dk/bremsegreb-til-faelgbremser/shimano-grx-sti-greb-hoejre-st-rx820-til-12-gears-kassetter-hydraulisk</vareurl>
</produkt>
</produkter>

所以基本上,我希望该函数仅返回产品提要中第一个产品的 URL(因为第一个产品的有库存值“På lager”,而第二个产品的缺货值“Ikke”) på lager”。

我尝试通过回显初始库存状态值进行调试。

php xml character-encoding
1个回答
0
投票

经过一些测试,我可以重现这个奇怪的问题。从 8.1 开始的 PHP 版本直接从 HTTP 解析时会出现这种情况。

作为解决方法,请将 feed 下载到本地临时文件:

$file = tempnam('.', 'feed');
$local = fopen($file, 'w');
$remote = fopen('https://www.partner-ads.com/dk/feed_udlaes.php?partnerid=16025&bannerid=16446&feedid=2', 'r');
stream_copy_to_stream($remote, $local);
fclose($local);
fclose($remote);

$nb = 0;
$reader = new XMLReader();
$reader->open($file);
while ($reader->read()) {
    if ($reader->nodeType == XMLReader::ELEMENT) {
        if ($reader->localName == 'produkt') {
            $productXml = $reader->readOuterXML();
            $product = simplexml_load_string($productXml);
            $stock_status = strtolower((string)$product->lagerantal);
            if ($stock_status === 'på lager')
                $nb++;
        }
    }
}
echo "På lager found: $nb";

unlink($file);

输出:

På lager found: 22026

备注:我没有做任何错误检查,我会让你正确地做。

© www.soinside.com 2019 - 2024. All rights reserved.