【问题标题】:Taking contents of text file and inserting them in necessary places in XML file获取文本文件的内容并将它们插入 XML 文件中的必要位置
【发布时间】:2014-08-25 18:10:27
【问题描述】:

我正在使用 Wordpress 制作网站 - 我正在使用 Amazon MWS PHP API 将 Amazon FBA(亚马逊物流)服务与 woocommerce 插件集成。到目前为止,我已经弄清楚了如何生成库存报告,然后使用 API 附带的 PHP 示例脚本下载它。现在,要将库存数据与 woocommerce 插件集成 - 我需要创建一个 XML 文件,该文件类似于 woocommerce 插件提供的 dummydata.xml 文件。这似乎是一个相当简单的问题,我之前已经编写过脚本来读取和写入文件 - 但我想确保我使用正确的工具来完成这项工作。库存文本文件在我下载后看起来就像这样。

item-name item-description Listing-id 卖家-sku 价格 数量 开放日期 image-url item-is-marketplace product-id-type zshop-shipping-fee item-note item-condition zshop-category1 zshop-browse -path zshop-storefront-feature asin1 asin2 asin3 will-ship-internationally expedited-shipping zshop-boldface product-id bid-for-featured-placement add-delete pending-quantity 履行渠道 Pioneer HDJ-1000 DJ 耳机 [电子] 0625OSJKQMG 3U-R7EP-QODZ 89 2014-06-25 12:26:27 PDT y 1 请注意颜色为银色,如图所示。未开封的制造商包装。 11 B0002DV7Z2 B0002DV7Z2 AMAZON_NA 上帝之眼 (Sigma Force) [大众市场平装本],Rollins, James 0624OQ2O5MM 86-CK3P-PHK6 4.89 0 2014-06-24 13:36:21 PDT y 1 状况极佳,封面有轻微折痕,但非常干净。 1 0061785679 1 N 0061785679 0 默认 创始兄弟:革命一代 [平装本] Ellis, Joseph J. 0514O4WDGIG NX-USS1-UXRY 3 2014-05-14 08:09:50 PDT y 1 1 0375705244 1 N 0375705244 AMAZON_NA JBL Flip无线蓝牙音箱(红色)[个人电脑] 0513O3A7IHY VB-GNYY-PMZS 89 0 2014-05-13 16:19:12 PDT y 1 11 B00DQAPJSY B00DQAPJSY 0 DEFAULT

为了筛选所有这些意味着什么 - 我创建了另一个文本文件,指出所有数据是什么 - 第一个块只是所有数据所属类别的列表 - 我尽了最大努力将数据的每一部分分配到正确的类别,项目从第二个块开始:

|项目名称 |物品描述 |列表ID |卖家sku |价格 |数量 |开放日期 |图片网址 |商品即市场 |产品ID类型| zshop-运费|项目注释 |项目条件 | zshop-category1 | zshop-浏览路径 | zshop 店面功能 |阿辛1 |阿辛2 | asin3 |将运送到国际|加急运输 | zshop-粗体 |产品编号 |为特色展示位置出价 |添加-删除 |待定数量 |履行渠道 |

|产品名称: Pioneer HDJ-1000 DJ 耳机 [电子] |列表编号:0625OSJKQMG |卖家货号:3U-R7EP-QODZ |价格:89 |数量:0时为空|开放日期:2014-06-25 12:26:27 PDT | image_url: 没有图片 | item-is-marketplace: 是 |产品 ID 类型:1 | zshop-shipping-fee: 无运费 |项目说明:请注意颜色为银色,如图所示。 |物品状况:未开封的制造商包装。 | zshop-category1?: 11 | asin: B0002DV7Z2 | asin: B0002DV7Z2 |频道:AMAZON_NA |

|物品名称:上帝之眼 (Sigma Force) [大众市场平装本] 由 Rollins, James |列表编号:0624OQ2O5MM |卖家货号:86-CK3P-PHK6 |价格:4.89 |数量:0(这个是出于某种原因)|开放日期:2014-06-24 13:36:21 PDT | item-is-mp: 是 |产品 ID 类型:1 |物品状况:状况极佳,封面有轻微折痕,但非常干净。 | zshop-category1: 1 |阿辛:0061785679 | ?: 1 | will-ship-international: N |阿辛:0061785679 |待定数量:0 |频道:DEFAULT(当商家)|

|项目名称: 创始兄弟:革命一代 [平装本] Ellis, Joseph J. |列表编号:0514O4WDGIG |卖家货号:NX-USS1-UXRY |价格:3 |日期:2014-05-14 08:09:50 PDT |是市场:y |产品 ID 类型:1 | ?: 1 |阿辛:0375705244 | ?: 1 |国际:N |阿辛:0375705244 |频道:AMAZON_NA |

| item-name: JBL Flip 无线蓝牙音箱(红色) [个人电脑] |列表编号:0513O3A7IHY |货号:VB-GNYY-PMZS |价格:89 |数量:0 |日期:2014-05-13 16:19:12 PDT |是市场:y |产品 ID 类型:1 | zshop 类别?:11 | asin: B00DQAPJSY | asin: B00DQAPJSY | ?: 0 |频道:默认 |

这就是 dummydata.xml 文件一开始的样子 - 我包含了一个项目的 XML:

<?xml version="1.0" encoding="UTF-8" ?>
<!-- This is a WordPress eXtended RSS file generated by WordPress as an export of your site. -->
<!-- It contains information about your site's posts, pages, comments, categories, and other content. -->
<!-- You may use this file to transfer that content from one site to another. -->
<!-- This file is not intended to serve as a complete backup of your site. -->

<!-- To import this information into a WordPress site follow these steps: -->
<!-- 1. Log in to that site as an administrator. -->
<!-- 2. Go to Tools: Import in the WordPress admin panel. -->
<!-- 3. Install the "WordPress" importer from the list. -->
<!-- 4. Activate & Run Importer. -->
<!-- 5. Upload this file using the form provided on that page. -->
<!-- 6. You will first be asked to map the authors in this export file to users -->
<!--    on the site. For each author, you may choose to map to an -->
<!--    existing user on the site or to create a new user. -->
<!-- 7. WordPress will then import each of the posts, pages, comments, categories, etc. -->
<!--    contained in this file into your site. -->

<!-- generator="WordPress/3.5.1" created="2013-06-14 12:35" -->
<rss version="2.0"
    xmlns:excerpt="http://wordpress.org/export/1.2/excerpt/"
    xmlns:content="http://purl.org/rss/1.0/modules/content/"
    xmlns:wfw="http://wellformedweb.org/CommentAPI/"
    xmlns:dc="http://purl.org/dc/elements/1.1/"
    xmlns:wp="http://wordpress.org/export/1.2/"
>

<channel>
    <title>WooCommerce Dummy Data</title>
    <link>http://demo2.woothemes.com/woocommerce</link>
    <description>Just another WooThemes Demo site</description>
    <pubDate>Fri, 14 Jun 2013 12:35:54 +0000</pubDate>
    <language>en-US</language>
    <wp:wxr_version>1.2</wp:wxr_version>
    <wp:base_site_url>http://demo2.woothemes.com/</wp:base_site_url>
    <wp:base_blog_url>http://demo2.woothemes.com/woocommerce</wp:base_blog_url>

    <wp:term><wp:term_id>17</wp:term_id><wp:term_taxonomy>pa_color</wp:term_taxonomy><wp:term_slug>black</wp:term_slug><wp:term_parent></wp:term_parent><wp:term_name><![CDATA[Black]]></wp:term_name></wp:term>
    <wp:term><wp:term_id>19</wp:term_id><wp:term_taxonomy>pa_color</wp:term_taxonomy><wp:term_slug>blue</wp:term_slug><wp:term_parent></wp:term_parent><wp:term_name><![CDATA[Blue]]></wp:term_name></wp:term>
    <wp:term><wp:term_id>12</wp:term_id><wp:term_taxonomy>shop_order_status</wp:term_taxonomy><wp:term_slug>cancelled</wp:term_slug><wp:term_parent></wp:term_parent><wp:term_name><![CDATA[cancelled]]></wp:term_name></wp:term>
    <wp:term><wp:term_id>10</wp:term_id><wp:term_taxonomy>shop_order_status</wp:term_taxonomy><wp:term_slug>completed</wp:term_slug><wp:term_parent></wp:term_parent><wp:term_name><![CDATA[completed]]></wp:term_name></wp:term>
    <wp:term><wp:term_id>5</wp:term_id><wp:term_taxonomy>product_type</wp:term_taxonomy><wp:term_slug>external</wp:term_slug><wp:term_parent></wp:term_parent><wp:term_name><![CDATA[external]]></wp:term_name></wp:term>
    <wp:term><wp:term_id>7</wp:term_id><wp:term_taxonomy>shop_order_status</wp:term_taxonomy><wp:term_slug>failed</wp:term_slug><wp:term_parent></wp:term_parent><wp:term_name><![CDATA[failed]]></wp:term_name></wp:term>
    <wp:term><wp:term_id>16</wp:term_id><wp:term_taxonomy>pa_color</wp:term_taxonomy><wp:term_slug>green</wp:term_slug><wp:term_parent></wp:term_parent><wp:term_name><![CDATA[Green]]></wp:term_name></wp:term>
    <wp:term><wp:term_id>3</wp:term_id><wp:term_taxonomy>product_type</wp:term_taxonomy><wp:term_slug>grouped</wp:term_slug><wp:term_parent></wp:term_parent><wp:term_name><![CDATA[grouped]]></wp:term_name></wp:term>
    <wp:term><wp:term_id>8</wp:term_id><wp:term_taxonomy>shop_order_status</wp:term_taxonomy><wp:term_slug>on-hold</wp:term_slug><wp:term_parent></wp:term_parent><wp:term_name><![CDATA[on-hold]]></wp:term_name></wp:term>
    <wp:term><wp:term_id>6</wp:term_id><wp:term_taxonomy>shop_order_status</wp:term_taxonomy><wp:term_slug>pending</wp:term_slug><wp:term_parent></wp:term_parent><wp:term_name><![CDATA[pending]]></wp:term_name></wp:term>
    <wp:term><wp:term_id>9</wp:term_id><wp:term_taxonomy>shop_order_status</wp:term_taxonomy><wp:term_slug>processing</wp:term_slug><wp:term_parent></wp:term_parent><wp:term_name><![CDATA[processing]]></wp:term_name></wp:term>
    <wp:term><wp:term_id>11</wp:term_id><wp:term_taxonomy>shop_order_status</wp:term_taxonomy><wp:term_slug>refunded</wp:term_slug><wp:term_parent></wp:term_parent><wp:term_name><![CDATA[refunded]]></wp:term_name></wp:term>
    <wp:term><wp:term_id>2</wp:term_id><wp:term_taxonomy>product_type</wp:term_taxonomy><wp:term_slug>simple</wp:term_slug><wp:term_parent></wp:term_parent><wp:term_name><![CDATA[simple]]></wp:term_name></wp:term>
    <wp:term><wp:term_id>4</wp:term_id><wp:term_taxonomy>product_type</wp:term_taxonomy><wp:term_slug>variable</wp:term_slug><wp:term_parent></wp:term_parent><wp:term_name><![CDATA[variable]]></wp:term_name></wp:term>
    <wp:term><wp:term_id>14</wp:term_id><wp:term_taxonomy>product_cat</wp:term_taxonomy><wp:term_slug>clothing</wp:term_slug><wp:term_parent></wp:term_parent><wp:term_name><![CDATA[Clothing]]></wp:term_name></wp:term>
    <wp:term><wp:term_id>18</wp:term_id><wp:term_taxonomy>product_cat</wp:term_taxonomy><wp:term_slug>hoodies</wp:term_slug><wp:term_parent>clothing</wp:term_parent><wp:term_name><![CDATA[Hoodies]]></wp:term_name></wp:term>
    <wp:term><wp:term_id>13</wp:term_id><wp:term_taxonomy>product_cat</wp:term_taxonomy><wp:term_slug>music</wp:term_slug><wp:term_parent></wp:term_parent><wp:term_name><![CDATA[Music]]></wp:term_name></wp:term>
    <wp:term><wp:term_id>20</wp:term_id><wp:term_taxonomy>product_cat</wp:term_taxonomy><wp:term_slug>posters</wp:term_slug><wp:term_parent></wp:term_parent><wp:term_name><![CDATA[Posters]]></wp:term_name></wp:term>
    <wp:term><wp:term_id>21</wp:term_id><wp:term_taxonomy>product_cat</wp:term_taxonomy><wp:term_slug>singles</wp:term_slug><wp:term_parent>music</wp:term_parent><wp:term_name><![CDATA[Singles]]></wp:term_name></wp:term>
    <wp:term><wp:term_id>15</wp:term_id><wp:term_taxonomy>product_cat</wp:term_taxonomy><wp:term_slug>t-shirts</wp:term_slug><wp:term_parent>clothing</wp:term_parent><wp:term_name><![CDATA[T-shirts]]></wp:term_name></wp:term>
    <wp:term><wp:term_id>22</wp:term_id><wp:term_taxonomy>product_cat</wp:term_taxonomy><wp:term_slug>albums</wp:term_slug><wp:term_parent>music</wp:term_parent><wp:term_name><![CDATA[Albums]]></wp:term_name></wp:term>

    <generator>http://wordpress.org/?v=3.5.1</generator>

    <item>
        <title>T_1_front</title>
        <link>http://demo2.woothemes.com/woocommerce/product/woo-logo/t_1_front/</link>
        <pubDate>Fri, 07 Jun 2013 10:35:28 +0000</pubDate>
        <dc:creator>wooteam</dc:creator>
        <guid isPermaLink="false">http://demo2.woothemes.com/dummydata/files/2013/06/T_1_front.jpg</guid>
        <description></description>
        <content:encoded><![CDATA[]]></content:encoded>
        <excerpt:encoded><![CDATA[]]></excerpt:encoded>
        <wp:post_id>16</wp:post_id>
        <wp:post_date>2013-06-07 10:35:28</wp:post_date>
        <wp:post_date_gmt>2013-06-07 10:35:28</wp:post_date_gmt>
        <wp:comment_status>open</wp:comment_status>
        <wp:ping_status>open</wp:ping_status>
        <wp:post_name>t_1_front</wp:post_name>
        <wp:status>inherit</wp:status>
        <wp:post_parent>15</wp:post_parent>
        <wp:menu_order>0</wp:menu_order>
        <wp:post_type>attachment</wp:post_type>
        <wp:post_password></wp:post_password>
        <wp:is_sticky>0</wp:is_sticky>
        <wp:attachment_url>http://demo2.woothemes.com/woocommerce/files/2013/06/T_1_front.jpg</wp:attachment_url>
        <wp:postmeta>
            <wp:meta_key>_wp_attached_file</wp:meta_key>
            <wp:meta_value><![CDATA[2013/06/T_1_front.jpg]]></wp:meta_value>
        </wp:postmeta>
        <wp:postmeta>
            <wp:meta_key>_wp_attachment_metadata</wp:meta_key>
            <wp:meta_value><![CDATA[a:5:{s:5:"width";i:1000;s:6:"height";i:1000;s:4:"file";s:21:"2013/06/T_1_front.jpg";s:5:"sizes";a:6:{s:9:"thumbnail";a:4:{s:4:"file";s:21:"T_1_front-150x150.jpg";s:5:"width";i:150;s:6:"height";i:150;s:9:"mime-type";s:10:"image/jpeg";}s:6:"medium";a:4:{s:4:"file";s:21:"T_1_front-300x300.jpg";s:5:"width";i:300;s:6:"height";i:300;s:9:"mime-type";s:10:"image/jpeg";}s:14:"post-thumbnail";a:4:{s:4:"file";s:21:"T_1_front-624x624.jpg";s:5:"width";i:624;s:6:"height";i:624;s:9:"mime-type";s:10:"image/jpeg";}s:14:"shop_thumbnail";a:4:{s:4:"file";s:19:"T_1_front-90x90.jpg";s:5:"width";i:90;s:6:"height";i:90;s:9:"mime-type";s:10:"image/jpeg";}s:12:"shop_catalog";a:4:{s:4:"file";s:21:"T_1_front-150x150.jpg";s:5:"width";i:150;s:6:"height";i:150;s:9:"mime-type";s:10:"image/jpeg";}s:11:"shop_single";a:4:{s:4:"file";s:21:"T_1_front-300x300.jpg";s:5:"width";i:300;s:6:"height";i:300;s:9:"mime-type";s:10:"image/jpeg";}}s:10:"image_meta";a:10:{s:8:"aperture";i:0;s:6:"credit";s:0:"";s:6:"camera";s:0:"";s:7:"caption";s:0:"";s:17:"created_timestamp";i:0;s:9:"copyright";s:0:"";s:12:"focal_length";i:0;s:3:"iso";i:0;s:13:"shutter_speed";i:0;s:5:"title";s:0:"";}}]]></wp:meta_value>
        </wp:postmeta>
    </item>

因此,我需要从库存报告中取出必要的内容 - 并将其放在 XML 文件中的正确位置。解决这个问题的最佳方法是什么?谢谢。

更新

我可以在获取报告的脚本中使用这个 php 函数来控制库存报告的格式:

/**
  * Get Report Action Sample
  * The GetReport operation returns the contents of a report. Reports can potentially be
  * very large (>100MB) which is why we only return one report at a time, and in a
  * streaming fashion.
  *   
  * @param MarketplaceWebService_Interface $service instance of MarketplaceWebService_Interface
  * @param mixed $request MarketplaceWebService_Model_GetReport or array of parameters
  */
  function invokeGetReport(MarketplaceWebService_Interface $service, $request) 
  {
      try {
              $response = $service->getReport($request);
              
                echo ("Service Response\n");
                echo ("=============================================================================\n");

                echo("        GetReportResponse\n");
                if ($response->isSetGetReportResult()) {
                  $getReportResult = $response->getGetReportResult(); 
                  echo ("            GetReport");
                  
                  if ($getReportResult->isSetContentMd5()) {
                    echo ("                ContentMd5");
                    echo ("                " . $getReportResult->getContentMd5() . "\n");
                  }
                }
                if ($response->isSetResponseMetadata()) { 
                    echo("            ResponseMetadata\n");
                    $responseMetadata = $response->getResponseMetadata();
                    if ($responseMetadata->isSetRequestId()) 
                    {
                        echo("                RequestId\n");
                        echo("                    " . $responseMetadata->getRequestId() . "\n");
                    }
                }
                
                echo ("        Report Contents\n");
                echo (stream_get_contents($request->getReport()) . "\n");

                echo("            ResponseHeaderMetadata: " . $response->getResponseHeaderMetadata() . "\n");
     } catch (MarketplaceWebService_Exception $ex) {
         echo("Caught Exception: " . $ex->getMessage() . "\n");
         echo("Response Status Code: " . $ex->getStatusCode() . "\n");
         echo("Error Code: " . $ex->getErrorCode() . "\n");
         echo("Error Type: " . $ex->getErrorType() . "\n");
         echo("Request ID: " . $ex->getRequestId() . "\n");
         echo("XML: " . $ex->getXML() . "\n");
         echo("ResponseHeaderMetadata: " . $ex->getResponseHeaderMetadata() . "\n");
     }
 }

是否有人对放置什么分隔符以及在哪里放置任何建议 - 以便我可以有效且可靠地解析数据?

重要的一行似乎是:

echo (stream_get_contents($request->getReport()) . "\n");

我需要一种方法来编辑流的内容,以便我可以添加分隔符,我想...

更新

我阅读了stream_get_contents 的手册,您可以使用一个参数来告诉它要获取多少字节 - 以及一个偏移量参数 - 我不能多次使用stream_get_contents - 每次都指定什么我想要的块,这样我就可以通过这种方式跟踪数据是什么?

【问题讨论】:

  • 那个输入文件基本上没用。任何部分之间都没有分隔符。你怎么知道一个“部分”在哪里结束,另一个从哪里开始?使用ID-ish信息很明显,但其余的呢?谁知道呢。
  • @MarcB - 是的,我意识到这只是一堆信息 - 我尽力分配东西 - 但你是对的,它的格式不正确 - 我想这只是问题的一部分- 除了像这样的报告之外,我没有看到任何其他方式从亚马逊获取库存 - 我可以将其写入任何类型的文件 btw - 一旦我运行脚本,它也会出现在浏览器中,但格式不正确要么。
  • @MarcB 另外 - 并非库存文件中的所有内容都是相关的 - 我只需要获取价格/数量等重要信息 - 必须有办法做到这一点......我的意思是我'我很确定我可以编写一些简单的文件读写脚本,然后输入足够的条件,这样它就可以得到正确的东西,但这似乎很痛苦,也许有更好的方法。
  • 是的,但如果没有分隔符来说明哪些位是哪些位,您会被困在“5 英尺长,S. Ubway 出品,售价 19.99 美元”之类的东西上。哪个是实际商品价格,哪个是标题的一部分?你我都知道价格是 19.99,但是你的代码怎么区分呢?
  • @MarcB 在获得所需内容之前,我不是必须费力地想出创造性的方法来让计算机计算正确的字符数吗?这可能吗?

标签: php xml wordpress parsing amazon


【解决方案1】:

我意识到.txt 文件是制表符分隔的,这使事情变得从超级困难变得非常简单 - 看起来它基本上是一个 .csv 但出于某种原因亚马逊将其输出为制表符分隔的.txt 文件.我找到了this stack question,它提供了处理您可以生成和下载的亚马逊库存报告的完美方式(如果其他人遇到此特定问题)。

我发现如果我为 while 循环的代码添加一个计数器 - 我可以跟踪它正在查看的行 - 然后我这样做了:

if ($counter === 0 ) {
    echo implode(" ", $data);
}

$data以数组的形式表示解析后的行。事实证明,第 0 行只是每一列的所有描述 - 就像这样:

item-name item-description Listing-id 卖家-sku 价格 数量 开放日期 image-url item-is-marketplace product-id-type zshop-shipping-fee item-note item-condition zshop-category1 zshop-browse -path zshop-storefront-feature asin1 asin2 asin3 will-ship-internationally expedited-shipping zshop-boldface product-id bid-for-featured-placement add-delete pending-quantityfulfilling-channel

当我输出第 1 行时,令我高兴的是,这是他库存中第一个物品的所有信息:

上帝之眼 (Sigma Force) [大众市场平装本],Rollins, James XXXXXX XXXXXX X.XX 0 2014-06-24 13:36:21 PDT y 1 状况极佳,封面有轻微折痕但非常干净. 1 0061785679 1 N 0061785679 0 默认

然后我发现第 2 行代表第二个项目,依此类推……所以它的包装非常整齐——至少如果您使用的是str_getcsv PHP 函数。

因为所有内容都是制表符分隔的 - 从报告中获取您需要的任何信息都变得微不足道,因为即使该列是空的 - 仍然会有一个制表符表示它是空的......很好整洁。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-12
    • 1970-01-01
    • 1970-01-01
    • 2015-06-29
    • 2022-12-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多