使用 php 解析 google 提要文件中的节点?

Parse node in google feed file with php?

我有一个 google 供稿文件,如下所示。

<item>
<g:id><![CDATA[147]]></g:id>
<g:title><![CDATA[ Kemerli Pantolon Dar Kesim 300-07 Pembe]]></g:title>
<g:description><![CDATA[ Kemerli Pantolon Dar Kesim 300-07 Pembe Özellikleri: RENK : Pembe KUMAŞ : g Cotton, 0 Viscose , %3 Lycra PANTOLON BOY : 92 cm MANKENİN ÜSTÜNDEKİ ÜRÜNÜN BEDENİ : 38 MEVSİM : Dört Mevsim AKSESUAR : Aksesuarlar ürüne dahil değildir. MANKENİN ÖLÇÜLERİ : Basen : 90 cm Bel : 60 cm Göğüs : 88 cm Boy : 168 cm Kilo : 50 kg ]]></g:description>
<g:link><![CDATA[https://www.tesetturpazari.com/kemerli-pantolon-dar-kesim-300-07-pembe]]></g:link>
<g:image_link><![CDATA[https://cdn.tesetturpazari.com/kemerli-pantolon-dar-kesim-300-07-pembe-1134-14-B.jpg]]></g:image_link>
<g:condition>new</g:condition>
<g:availability>in stock</g:availability>
<g:identifier_exists>yes</g:identifier_exists>
<g:price><![CDATA[29.91 TRY]]></g:price>
<g:brand><![CDATA[Dar Kesim Pantolon]]></g:brand>
<g:google_product_category><![CDATA[Kıyafet ve Aksesuarlar > Giyim Eşyaları > Pantolonlar]]></g:google_product_category>
<g:product_type><![CDATA[Giyim > Pantolon > Dar Kesim Pantolon]]></g:product_type>
<g:custom_label_0>Degil</g:custom_label_0>
<g:sale_price><![CDATA[]]></g:sale_price>
<g:sale_price_effective_date><![CDATA[]]></g:sale_price_effective_date>
<g:gtin><![CDATA[300-07]]></g:gtin>
<g:gender>kadın</g:gender>
<g:age_group>adult</g:age_group>
<g:additional_image_link>https://cdn.tesetturpazari.com/kemerli-pantolon-dar-kesim-300-07-pembe-dar-kesim-pantolon-dar-kesim-pantolon-dar-kesim-1134-14-B.jpg</g:additional_image_link>
<g:additional_image_link>https://cdn.tesetturpazari.com/kemerli-pantolon-dar-kesim-300-07-pembe-dar-kesim-pantolon-dar-kesim-pantolon-dar-kesim-1135-14-B.jpg</g:additional_image_link>
<g:additional_image_link>https://cdn.tesetturpazari.com/kemerli-pantolon-dar-kesim-300-07-pembe-dar-kesim-pantolon-dar-kesim-pantolon-dar-kesim-1136-14-B.jpg</g:additional_image_link>
</item>

我正在尝试使用 XMLReader class 解析此文件并将其保存到数据库中。我如下解析了所有的 noteType。

    $xmlReader = new XMLReader();
        $xmlReader->open('http://.........');
        while ($xmlReader->read()) {

            if ($xmlReader->nodeType == XMLReader::ELEMENT && $xmlReader->localname == "item") {
                $xmlReader->read();
                $item = array();

            }
            
            if ($xmlReader->nodeType == XMLReader::ELEMENT && $xmlReader->prefix == "g") {

                if ($xmlReader->localName == 'id') {
                    $xmlReader->read();
                    $item['g:id'] = $xmlReader->value;
                }
                if ($xmlReader->localName == 'title') {
                    $xmlReader->read();
                    $item['g:title'] = $xmlReader->value;
                }
                if ($xmlReader->localName == 'description') {
                    $xmlReader->read();
                    $item['g:description'] = $xmlReader->value;
                }
                if ($xmlReader->localName == 'link') {
                    $xmlReader->read();
                    $item['g:link'] = $xmlReader->value;
                }
                if ($xmlReader->localName == 'image_link') {
                    $xmlReader->read();
                    $item['g:image_link'] = $xmlReader->value;
                }
                if ($xmlReader->localName == 'condition') {
                    $xmlReader->read();
                    $item['g:condition'] = $xmlReader->value;
                }
                if ($xmlReader->localName == 'availability') {
                    $xmlReader->read();
                    $item['g:availability'] = $xmlReader->value;
                }
                if ($xmlReader->localName == 'identifier_exists') {
                    $xmlReader->read();
                    $item['g:identifier_exists'] = $xmlReader->value;
                }
                if ($xmlReader->localName == 'price') {
                    $xmlReader->read();
                    $item['g:price'] = $xmlReader->value;
                }
                if ($xmlReader->localName == 'brand') {
                    $xmlReader->read();
                    $item['g:brand'] = $xmlReader->value;
                }
                if ($xmlReader->localName == 'google_product_category') {
                    $xmlReader->read();
                    $item['g:google_product_category'] = $xmlReader->value;
                }
                if ($xmlReader->localName == 'product_type') {
                    $xmlReader->read();
                    $item['g:product_type'] = $xmlReader->value;
                }
                if ($xmlReader->localName == 'custom_label_0') {
                    $xmlReader->read();
                    $item['g:custom_label_0'] = $xmlReader->value;
                }
                if ($xmlReader->localName == 'sale_price') {
                    $xmlReader->read();
                    $item['g:sale_price'] = $xmlReader->value;
                }
                if ($xmlReader->localName == 'sale_price_effective_date') {
                    $xmlReader->read();
                    $item['g:sale_price_effective_date'] = $xmlReader->value;
                }


                if ($xmlReader->localName == 'gtin') {
                    $xmlReader->read();
                    $item['g:gtin'] = $xmlReader->value;
                    $items[] = $item;
                }


            }

        }
        $date = new DateTime('NOW');
        $kayit_tarih = $date->format('Y-m-d H:i:s');
        $kontrol_tarih = $date->format('Y-m-d');
       
        foreach ($items as $value) {
            $id = $value['g:id'];
            $description = $value['g:description'];
            $title = $value['g:title'];
            $link = $value['g:link'];
            $image_link = $value['g:image_link'];
            $condition = $value['g:condition'];
            $availability = $value['g:availability'];
            $identifier_exists = $value['g:identifier_exists'];
            $price = $value['g:price'];
            $brand = $value['g:brand'];
            $google_product_category = $value['g:google_product_category'];
            $product_type = $value['g:product_type'];
            $sale_price = $value['g:sale_price'];
            $sale_price_effective_date = $value['g:sale_price_effective_date'];
            $gtin = $value['g:gtin'];
            $in_up_Data = $this->model("readerModel")->xmlInsert($id, $title, $description, $condition, $link, $image_link, $image_link, $image_link, $availability, $identifier_exists, $price, $brand, $google_product_category, $product_type, $sale_price, $sale_price_effective_date, $gtin, "Boyutlandırılmadı", $kayit_tarih, $kontrol_tarih);
            

        }

但是

<g:additional_image_link>https://cdn.tesetturpazari.com/kemerli-pantolon-dar-kesim-300-07-pembe-dar-kesim-pantolon-dar-kesim-pantolon-dar-kesim-1134-14-B.jpg</g:additional_image_link>
<g:additional_image_link>https://cdn.tesetturpazari.com/kemerli-pantolon-dar-kesim-300-07-pembe-dar-kesim-pantolon-dar-kesim-pantolon-dar-kesim-1135-14-B.jpg</g:additional_image_link>
<g:additional_image_link>https://cdn.tesetturpazari.com/kemerli-pantolon-dar-kesim-300-07-pembe-dar-kesim-pantolon-dar-kesim-pantolon-dar-kesim-1136-14-B.jpg</g:additional_image_link>
我无法解析。 我如何解析这里的结并将其转移到循环中。我尝试了很多东西。但是我得合理使用XMLReaderClass。解析后,我将其注册到数据库中。存入数据库没有问题。问题是我无法解析具有与上述相同标签的图像路径。

我该怎么做?你能帮帮我吗

您可以通过将每个 <item> 节点导入 SimpleXMLElement 来简化 XMLReader 中的大量样板代码。这样可以更轻松地一次处理每个完整元素。

在此代码中,每个 <item> 使用一个 foreach() 循环将所有子元素提取到一个单独的数组($item 数组)中。如果已经遇到该项目,则将其转换为项目数组,并将后续的每个项目添加到列表中...

$xmlReader = new XMLReader();
$xmlReader->open('http://.........');
$doc = new DOMDocument('1.0','UTF-8');
while ($xmlReader->read()) {
    
    if ($xmlReader->nodeType == XMLReader::ELEMENT && $xmlReader->localName == "item") {
        // Load the XML under the <item> tag into SimpleXML
        $data = simplexml_import_dom($doc->importNode($xmlReader->expand(), true));
        $item = [];
        // Loop over the child elements from the 'g' namespace
        foreach  ($data->children("g", true) as $tag => $value )    {
            $tag = "g:".$tag;
            // If an item with that tag name already exists, convert it to an array of items
            if ( isset($item[$tag]) )   {
                if ( !is_array($item[$tag]))    {
                    $item[$tag] = [$item[$tag]];
                }
                $item[$tag][] = (string)$value;
            }
            else    {
                // For normal items, add in the value (as a string) to the array
                $item[$tag] = (string) $value;
            }
        }
        // Store new item
        $items[] = $item;
    }
}

所以你的数组将包含类似...

Array
(
    [g:id] => 147
    [g:title] =>  Kemerli Pantolon Dar Kesim 300-07 Pembe
    [g:description] =>  Kemerli Pantolon Dar Kesim 300-07 Pembe Özellikleri: RENK : Pembe KUMAŞ : g Cotton, 0 Viscose , %3 Lycra PANTOLON BOY : 92 cm MANKENİN ÜSTÜNDEKİ ÜRÜNÜN BEDENİ : 38 MEVSİM : Dört Mevsim AKSESUAR : Aksesuarlar ürüne dahil değildir. MANKENİN ÖLÇÜLERİ : Basen : 90 cm Bel : 60 cm Göğüs : 88 cm Boy : 168 cm Kilo : 50 kg 
    [g:link] => https://www.tesetturpazari.com/kemerli-pantolon-dar-kesim-300-07-pembe
    [g:image_link] => https://cdn.tesetturpazari.com/kemerli-pantolon-dar-kesim-300-07-pembe-1134-14-B.jpg
    [g:condition] => new
    [g:availability] => in stock
    [g:identifier_exists] => yes
    [g:price] => 29.91 TRY
    [g:brand] => Dar Kesim Pantolon
    [g:google_product_category] => Kıyafet ve Aksesuarlar > Giyim Eşyaları > Pantolonlar
    [g:product_type] => Giyim > Pantolon > Dar Kesim Pantolon
    [g:custom_label_0] => Degil
    [g:sale_price] =>       
    [g:sale_price_effective_date] =>        
    [g:gtin] => 300-07
    [g:gender] => kadın
    [g:age_group] => adult
    [g:additional_image_link] => Array
        (
            [0] => https://cdn.tesetturpazari.com/kemerli-pantolon-dar-kesim-300-07-pembe-dar-kesim-pantolon-dar-kesim-pantolon-dar-kesim-1134-14-B.jpg     
            [1] => https://cdn.tesetturpazari.com/kemerli-pantolon-dar-kesim-300-07-pembe-dar-kesim-pantolon-dar-kesim-pantolon-dar-kesim-1135-14-B.jpg     
            [2] => https://cdn.tesetturpazari.com/kemerli-pantolon-dar-kesim-300-07-pembe-dar-kesim-pantolon-dar-kesim-pantolon-dar-kesim-1136-14-B.jpg     
        )
)

您必须决定如何处理这些项目,但这将为您提取数据。