Php 在simplexml\u加载文件中循环时,如何获取选项值

Php 在simplexml\u加载文件中循环时,如何获取选项值,php,xml,csv,Php,Xml,Csv,我有一个php脚本,它读取一个xml文件,循环遍历这些值,并将它们转换为变量,稍后我将使用这些变量生成一个csv文件 在某种程度上,它工作得很好。xml中的一项是选项,我遇到的问题是有大量不同的选项类型。我在下面放了一个我正在使用的代码示例,当我知道选项是什么时,它工作正常,但不幸的是,有时选项有不同的拼写或是新选项,所以我需要先读取选项,然后将它们及其值写入变量 下面是我一直在做的事情,举一个例子,阅读大小选项 $xml=simplexml\u load\u文件($xml\u url); fo

我有一个php脚本,它读取一个xml文件,循环遍历这些值,并将它们转换为变量,稍后我将使用这些变量生成一个csv文件

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

下面是我一直在做的事情,举一个例子,阅读大小选项

$xml=simplexml\u load\u文件($xml\u url);
foreach($xml->item as$\u item){
//获取项目SKU
$sku=$\项目->sku;
//循环浏览大小并将其指定给$size[$i]
$i=0;
foreach($\项目->选项->大小为$\大小){
$size[$i++]=$\u size;
}
$fopt=fopen('options.csv','a');
如果(isset($size)){
foreach($s大小){
$thisline=$sku.`Size:Select`.$s.`12'.“\n”;
fwrite($fopt,$thisline);
}
未结算(规模);
}       
}
上面代码中的$thisline变量是csv需要的布局,但当每个项目有多个选项时,第二个字段看起来像“
Size:Select,Color:Select

所以我需要做的是循环遍历这些选项,如果有,找出它们是什么,并将它们的值写入
$thisline
变量

下面是xml文件布局的示例


63344
0.0100
29.99
http://www.clothing.com
男式夹克
123
衣裳
234
夹克
jpg1
jpg2
32
34
36
38
红色
蓝色
这里有简短的描述
这里有更详细的描述
62211
0.0100
39.99
http://www.clothing.com
男式裤子
123
衣裳
234
裤子
jpg5
jpg7
28
30
32
红色
蓝色
这里有简短的描述
这里有更详细的描述
22111
0.0100
19.99
http://www.clothing.com
男式衬衫
123
衣裳
234
衬衫
jpg9
jpg44
棕色的
蓝色
绿色
这里有简短的描述
这里有更详细的描述

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

您可以添加根元素:

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

…您可以在这里查看XML内容。。。

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

xml文档中的一个根元素。在xml文件中有2个“item”元素

您可以添加根元素:

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

…您可以在这里查看XML内容。。。

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

这就是您要寻找的东西吗

$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节点上循环,关键是索引。这允许您将数据分组到不同的数组中


一旦你完成了这项工作,就可以很容易地以你想要的任何格式输出数据。

这就是你想要的吗

$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节点上循环,关键是索引。这允许您将数据分组到不同的数组中


一旦完成了这项工作,就可以轻松地以所需的任何格式输出数据。

是的,正如Alexander所说,xml文档需要一个根节点。应该用一句话作为开场白,它是XML:非常感谢Rob,这几乎是完美的。这正是我所需要的,我现在唯一的小问题是具有多个不同选项的项目的输出方式。上面的代码将它们作为单独的行进行循环,这应该很好,但是我在(prestashop)中使用的csv导入工具实际上不会像这样正常工作,因为它要求每个产品的多个选项位于同一个字段中,并用逗号分隔。我已经测试了和上面的输出。像
123
Color:Select
red
123
Size:Select
32
我需要的是它在一行上输出
123
Color:Select,Size:Select
red,32
,只是为了澄清一下,您正在csv中为单个项目的所有选项的每个可能组合寻找一行?例如,如果你有红色和蓝色以及尺寸10和12,你将有4行,类似于颜色:选择,尺寸:选择
red,10
|颜色:选择,尺寸:选择“红色,12”|颜色:选择,尺寸:选择“蓝色,10”|颜色:选择,尺寸:选择“蓝色,12”|罗布,这正是我需要的,但我一直在研究它,我目前正在研究的xml只有少数几个项目具有多个组合(数千个项目中),因此我可能只需要使用现有的项目,手动编辑需要它的少数项目。非常感谢您的帮助,我已经花了数周的时间弄清楚您在lol上面做了什么。是的,正如Alexander所发布的,您的xml文档需要一个根节点。应该用一句话作为开场白,它是XML:非常感谢Rob,这几乎是完美的。这正是我所需要的,我现在唯一的小问题是具有多个不同选项的项目的输出方式。上面的代码将它们作为单独的行循环,这应该可以,但是我在(prestashop)中使用的csv导入工具实际上不能像这样正常工作,因为它需要多个选项