2

SimpleXML を使用して CSV に変換しようとしているマルチレベルの XML ファイルがあります。ファイルは次のようになります。

  <Products>
        <Product>
            <StyleCode>Product Number 1</StyleCode>
            <Name>Name of Product 1</Name>
            <Description>Product 1 Is Great</Description>
            <Categories>
                <Category>SS-TEES</Category>
            </Categories>
            <Items>
                <Item>
                    <Code>1111122223333444</Code>
                    <Barcode>1111122223333444</Barcode>
                    <Size>2XL</Size>
                    <ShortColour>BLK</ShortColour>
                    <Colour>BLACK</Colour>
                    <Price>39.95</Price>
                    <StockOnHand>6</StockOnHand>
                </Item>
                <Item>
                    <Code>0000001427002001</Code>
                    <Barcode>0000001427002001</Barcode>
                    <Size>M</Size>
                    <ShortColour>BLK</ShortColour>
                    <Colour>BLACK</Colour>
                    <Price>39.95</Price>
                    <PriceSpecial>0</PriceSpecial>
                    <StockOnHand>2</StockOnHand>
                </Item>
            </Items>
       </Product>
       <Product>
        .......
       </Product>
</Products>

これをCSVに入れるのに問題があります。私は単純な 1 レベルの XML ファイルで成功しましたが、これは面倒です。

各 ITEM には、その親 PRODUCT からの情報を含む CSV 上の独自の行が必要です。

したがって、CSV の最初の行は次のようになります。

Product Number 1, Name of Product 1, Product 1 Is Great, SS-TEES, 111222333, 111222333, 2XL, BLK, Black, 39.95, 6

行 2 は次のようになります。

Product Number 1, Name of Product 1, Product 1 Is Great, SS-TEES, 00000142, 00001427, M, Blk, Black, 39.95, 2

等々。

製品の最初の子を変数(スタイルコード、名前、説明など)に保存し、アイテムがある間に最初の子変数を出力してからアイテムを出力する必要があると考えていますが、方法がよくわかりませんそれについて行きます。

構造はドキュメント全体で一貫していますが、空白のフィールドがあります。

4

1 に答える 1

0

これを試して:

<pre><?php
$sx = simplexml_load_file("test.xml");
$new_items = array();
foreach($sx->Product as $product){  
    foreach($product->Items->Item as $item){
        array_push($new_items,array(
            "stylecode" => (string)$product->StyleCode,
            "name" => (string)$product->Name,           
            "description" => (string)$product->Description,
            "categories" => (string)(is_array($product->Categories))?implode("|",$product->Categories):(string)$product->Categories->Category,
            "code" => (string)$item->Code,          
            "barcode" => (string)$item->Barcode,            
            "size" => (string)$item->Size,          
            "shortcolor" => (string)$item->ShortColour,         
            "color" => (string)$item->Colour,           
            "price" => (string)$item->Price,            
            "stockonhand" => (string)$item->StockOnHand         
        ));     
    }
}

array_walk($new_items,function($element,$key)use(&$new_items){
    $new_items[$key]="`".implode("`,`",$element);
});

print_r($new_items);
于 2012-05-17T00:33:59.970 に答える