1

我有一个 php 脚本,它读取一个 xml 文件并循环遍历这些值并将它们分配给我以后用来制作 csv 文件的变量。

在某种程度上它工作得很好。xml 中的一项是选项,我遇到的问题是有很多不同的选项类型。我在下面放了一个我正在使用的代码示例,当我知道选项是什么时它可以正常工作,但不幸的是,有时选项有不同的拼写或者是新选项,所以我需要先阅读选项然后编写它们和他们的值到一个变量。

这就是我一直在做的事情,并以阅读 Size 选项的示例为例。

$xml = simplexml_load_file($xml_url);

foreach($xml->item as $_item){
 //Get The Item SKU
    $sku = $_item->sku;

 //Loop through the sizes and assign them to $size[$i]  
$i=0;
foreach($_item->options->Size as $_size){
        $size[$i++] = $_size;
        }

$fopt = fopen('options.csv', 'a');      
if (isset($size))   {
foreach($size as $s){
    $thisline = $sku . '`Size:Select`' . $s . '`12' . "\n";
    fwrite($fopt, $thisline);
                    }
        unset($size);       
                }       
}

上面代码中的 $thisline 变量是 csv 需要的布局,除了当每个项目有多个选项时,第二个字段看起来像 ' Size:Select,Color:Select'

所以我需要做的是遍历选项,如果有的话,找出它们是什么,并将它们和它们的$thisline值一起写入变量。

下面是xml文件的布局示例

<?xml version="1.0">
<root>
    <item>
        <sku>63344</sku>
        <weight>0.0100</weight>
        <Price>29.99</Price>
        <url>http://www.clothing.com</url>
        <name>Mens Jacket</name>
        <category>
            <parent_id>123</parent_id>
            <parent_name>Clothes</parent_name>
            <category_id>234</category_id>
            <category_name>Jackets</category_name>
        </category>
        <media>
            <image>jpg1</image>
            <image>jpg2</image>
        </media>
        <options>
            <Size>32</Size>
            <Size>34</Size>
            <Size>36</Size>
            <Size>38</Size>
            <Color>Red</Color>
            <Color>Blue</Color>
        </options>
        <short_description>Short description here</short_description>
        <description>Longer Description Here</description>
    </item>
    <item>
        <sku>62211</sku>
        <weight>0.0100</weight>
        <Price>39.99</Price>
        <url>http://www.clothing.com</url>
        <name>Mens Trousers</name>
        <category>
            <parent_id>123</parent_id>
            <parent_name>Clothes</parent_name>
            <category_id>234</category_id>
            <category_name>Trousers</category_name>
        </category>
        <media>
            <image>jpg5</image>
            <image>jpg7</image>
        </media>
        <options>
            <Trouser_Size>28</Trouser_Size>
            <Trouser_Size>30</Trouser_Size>
            <Trouser_Size>32</Trouser_Size>
            <Color>Red</Color>
            <Color>Blue</Color>
        </options>
        <short_description>Short description here</short_description>
        <description>Longer Description Here</description>
    </item>
    <item>
        <sku>22111</sku>
        <weight>0.0100</weight>
        <Price>19.99</Price>
        <url>http://www.clothing.com</url>
        <name>Mens Shirt</name>
        <category>
            <parent_id>123</parent_id>
            <parent_name>Clothes</parent_name>
            <category_id>234</category_id>
            <category_name>Shirts</category_name>
        </category>
        <media>
            <image>jpg9</image>
            <image>jpg44</image>
        </media>
        <options>
            <Button_Color>Brown</Button_Color>
            <Button_Color>Blue</Button_Color>
            <Button_Color>Green</Button_Color>
        </options>
        <short_description>Short description here</short_description>
        <description>Longer Description Here</description>
    </item>
</root>
4

2 回答 2

1

这是你要找的东西吗?

$xml = simplexml_load_file( $xml_url );

$fopt = fopen( 'options.csv', 'w' ); 

foreach( $xml->item as $_item ){

    //Get The Item SKU
    $sku = $_item->sku;
    $options = array();

    // Collect all the options into a single multi-dimensional array
    foreach( $_item->options as $_thisOptionSet ) {
        foreach( $_thisOptionSet as $_thisOptionSetName => $thisOptionSetElement ) {
            $options[ $_thisOptionSetName ][] = (string) $thisOptionSetElement;
        }
    }

    // Format the output
    foreach( $options as $optionName => $optionValues ) {
        foreach(  $optionValues as $thisOptionValue ) {
            $thisline = $sku . '`'.$optionName.':Select`' . $thisOptionValue . '`12' . "\n";
            fwrite( $fopt, $thisline );
        }
    }
}
fclose( $fopt );

关键是您可以遍历 XML 节点,而关键是索引。这允许您将数据分组到不同的数组中。

一旦你完成了,就很容易以你正在寻找的任何格式输出数据。

于 2013-11-12T17:36:07.633 回答
0

在 xml 文档中应该是一个根元素。在 xml 文件中,您有 2 个“项目”元素。

您可以添加根元素:

<itemList>
   ...You XML content here...
</itemList>

或删除 xml 文件中的第二个元素,以获得格式良好的 xml 文档。

于 2013-11-12T17:19:54.730 回答