在循环遍历simplexml_load_file时如何获取选项值

时间:2013-11-12 17:08:55

标签: php xml csv

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

它的工作非常重要。 xml中的一个项目是选项,我遇到的问题是有不同的选项类型。我已经在下面放了一些我正在使用的代码示例,当我知道选项是什么时它可以正常工作但不幸的是有时选项有不同的拼写或是新的选项,所以我需要首先阅读选项然后编写它们他们对变量的价值。

以下是我一直在做的事情,以及阅读尺寸选项的示例。

$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>

2 个答案:

答案 0 :(得分: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节点,密钥将是索引。这允许您将数据分组到不同的数组中。

完成后,您可以轻松地以您正在寻找的任何格式输出数据。

答案 1 :(得分:0)

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

您可以添加根元素:

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

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