我有一个从供应商,products.xml下载的文件。我有一个脚本从该文件中获取数据并将其放在csv文件中。
所以我正在查看这个脚本,似乎有从xml中提取的数据,我无法用任何xml编辑器查看。例如,像图像和类别。另一方面,我看到xml文件中的某些字段在应该存在时不会被放入csv中,例如产品名称。
除了添加产品名称和说明外,它做的一切正确。
这是脚本将数据从xml抓取到数组中的地方。
foreach($xmlData->children() as $product){
// Create an array which holds all of the data merged from the xml file
$filteredData = array('code' => (string)$product->sku
,'name' => (string)$product->name
,'brand' => (string)$product->manufacturer
,'description' => (string)$product->long_description
,'costPrice' => (string)$product->price
,'price' => (((string)$product->price) * 2)
,'freeShipping' => 0
,'weight' => (string)$product->weight
,'allowPurchases' => 1
,'productVisible' => 1
,'productAvailability' => 'Ships within 48 Hours'
,'trackInventory' => 1
,'stockLevel' => (string)$product->stock_quantity
,'lowStockLevel' => 1
,'productCondition' => 'New'
,'upc' => (string)$product->barcode
,'category' => '');
// First category name goes to category details field
// If more than one category name exists, last category name goes to category field
$filteredData['categoryDetails'] = (string)$product->categories->category[0];
$categoryCount = count($product->categories->children());
if($categoryCount > 1){
$filteredData['category'] = (string)$product->categories->category[$categoryCount - 1];
}
// Product image links must be appended to: http://images.xyz.com/product_images
$staticLinkToPrepend = 'http://images.xyz.com/product_images';
$filteredData['images'] = array();
foreach($product->images->children() as $image){
$filteredData['images'][] = $staticLinkToPrepend . ((string)$image);
}
在products.xml文件中,我看不到任何类别的引用,但编写的代码在csv文件中生成了正确的类别。在xml文件中,我看不到图像的任何引用,但是此代码为每个产品生成正确的图像列表。这一切都很棒,但我需要理解为什么会这样。一旦我理解了这一点,我就可以弄清楚为什么名称和产品描述部分不起作用。
他也只使用"描述"对于产品描述,但在xml文件中,它有long_description和short_description。这些都不奏效。名称在xml文件中按原样列出,因此我不确定它为什么不起作用。
Array
(
[product] => Array
(
[0] => Array
(
[@attributes] => Array
(
[sku] => CATDJ
[type] => BR
[vendor] => DJ
[active] => 0
[on_sale] => 0
[discountable] => 0
)
[name] => DJ CATALOGS
[short_description] => Array
(
)
[long_description] => Array
(
)
[price] => 1.5
[stock_quantity] => 0
[release_date] => 2003-05-06T00:00:00-04:00
[barcode] => 782421712315
)
[1] => Array
(
[@attributes] => Array
(
[sku] => CATPD
[type] => DISC
[vendor] => PIEDR
[active] => 0
[on_sale] => 0
[discountable] => 0
)
[name] => PIE DRUM CATALOG
[short_description] => Array
(
)
[long_description] => Array
(
)
[price] => 1.5
[stock_quantity] => 0
[release_date] => 2003-05-06T00:00:00-04:00
[barcode] => 603912241230
)
)
)
我刚拿了xml文件并将其减少到只有两个产品。我使用以下内容来实现上述目标。
if(!file_exists($xmlFileName)){
die('* XML file path is incorrect. Please change and try again.');
}
$xmlData = simplexml_load_file($xmlFileName);
$json = json_encode($xmlData);
$array = json_decode($json,TRUE);
print "<pre>";
print_r($array);
print "</pre>";
所以&#34;名字&#34;是的,但它不会出现在最后的csv中。有long_description和short_description,但使用上面的内容看起来是空的,但它们肯定是带有文本值的xml文件。
我能够为我的Share-A-Sale Feed创建另一个基于此脚本的脚本,但该数据来自数据库,我没有遇到任何问题。但我已经在这个问题上待了两个星期。我现在正在改造我的网站,这就是我首先需要它的原因。
这是xml文件中的示例条目。
<products>
<product sku="CATDJ" type="BR" vendor="DJ" active="0" on_sale="0" discountable="0">
<name>DJ CATALOGS</name>
<short_description><![CDATA[some short description]]></short_description>
<long_description><![CDATA[some long description]]></long_description>
<price>1.5</price>
<stock_quantity>0</stock_quantity>
<release_date>2003-05-06T00:00:00-04:00</release_date>
<barcode>782421712315</barcode>
</product>
</products>
更新:现在我真的很困惑。我从备份中挖出了旧版本的products.xml文件,以查看供应商是否更改了xml文件。它有很大的不同,我可以看到更多的字段(见下文),但我仍然感到困惑的是,当前没有列出图像和类别数据的产品文件如何仍能产生数据。 csv文件。
<product active="1" on_sale="0" discountable="0">
<sku>AL1012XO</sku>
<name>
<![CDATA[LACE UP GLOVES]]>
</name>
<description>
<![CDATA[Able to be adjusted as tight as you desire with a lace-and-grommet closure, they extend over the tops of the hands and have a built-in finger loop for a sleek look.]]>
</description>
<keywords></keywords>
<price>10.100000</price>
<stock_quantity>34</stock_quantity>
<reorder_quantity>0</reorder_quantity>
<height>0.000000</height>
<length>0.000000</length>
<diameter>0.000000</diameter>
<weight>0.000000</weight>
<color>Black</color>
<material>cotton</material>
<barcode>883125011270</barcode>
<release_date>2008-11-10</release_date>
<images>
<image>/AL1012XO/AL1012XO.jpg</image>
<image>/AL1012XO/AL1012XOB.jpg</image>
</images>
<categories>
<category code="166" video="0" parent="172">Clothing</category>
<category code="172" video="0" parent="">Clothing</category>
<category code="641" video="0" parent="172">Accessories</category>
<category code="167" video="0" parent="1001">Costumes</category>
</categories>
<manufacturer code="AL" video="0">Golvers</manufacturer>
<type code="AC" video="0">AC</type>
更新:我想我能够到达那里。我仍然不知道为什么我无法看到xml文件中的所有内容,但它仍然存在。 csv就像我想要的那样但是我仍然无法获得csv文件中的名称和描述。值得注意的是,名称和描述的引用是正确的,并使用print_r打印数据,但似乎问题是将数据导入csv文件。看来这两个字段是[CDATA]中唯一的两个字段[所以我正在研究为什么CDATA字段不能进入csv文件。我现在也在使用它。
$xmlData = simplexml_load_file($xmlFileName, null, LIBXML_NOCDATA);
我已经放弃了。我已经浏览了这个网站和网站,感觉我已经尝试了一切。我不明白为什么&#34; name&#34;和&#34;描述&#34;当其他一切都很好时,数据将不会写入csv文件。 xml文件中的名称和描述看起来非常简单。我知道这个剧本在一年前就开始工作了,我不知道为什么它现在只适用于这两件事。 :(
答案 0 :(得分:0)
您想使用LIBXML_NOCDATA
。这适用于我使用您的示例数据:
$xmlData = simplexml_load_string($xml, null, LIBXML_NOCDATA);
echo $xmlData->product->name."\n";
echo $xmlData->product->short_description."\n";
echo $xmlData->product->long_description."\n";
输出:
DJ CATALOGS
some short description
some long description
答案 1 :(得分:0)
我的供应商将成为我的死亡。他们有3个不同的xml链接,声称是整个目录。他们都不是。我是从旧链接中拉出来的。我仍然不知道为什么它不会将名称和描述放在csv中,因为那些字段在那里。但是我使用了上面列出的那个我觉得有隐藏字段的东西(它没有),是的,那个缺少大部分有用的产品数据。至少要看一个他们说有图像的不同xml文件,它有我需要的所有信息。所有这一切都无济于事。 :)