0

過去 4 日間、この XML ファイルをこのフィールド分布で CSV に変換しようとしています

XMLファイル部分

<!-- language: lang-xml -->

<ponudba podjetje="SO d.o.o." velja_od="23.09.2012 @ 12:30:48">
    <artikel koda="LS593EAR" naziv="HP ENVY 17-2199e" kategorija="Prenosniki" podkategorija="Hewlett Packard (HP)" v_akciji="ne" kosovnost="več">
    <opis>
    HP ENVY 17-2199el, Intel Core i7-2630QM (2.0 GHz), 17.3'' FHD AG LED 3D, 8 GB DDR3 (2x 4 GB), 1 TB, BluRay, ATI Radeon HD6850 1024 MB, WiFi, Bluetooth, Webcam, 3D glasses, Microsoft Windows 7 Home Premium (64 bit)
    </opis>
    <opis_detail>
    HP ENVY 17-2199el, Intel Core i7-2630QM (2.0 GHz), 17.3'' FHD AG LED 3D, 8 GB DDR3 (2x 4 GB), 1 TB, BluRay, ATI Radeon HD6850 1024 MB, WiFi, Bluetooth, Webcam, 3D glasses, Microsoft Windows 7 Home Premium (64 bit)<br/><table> <col width="25%" /> <col /> <tbody> <tr> <th>Procesor</th> <td>Intel® Core™ i7-2630QM / 2.00 GHz / Quad-Core</td> </tr> <tr> <th>Delovni pomnilnik</th> <td>8 GB DDR3</td> </tr> <tr> <th>Trdi disk</th> <td>1 TB (1000 GB) / 5400 / SATA</td> </tr> <tr> <th>LCD zaslon</th> <td>43,9 cm (17,3'') Full HD HP Ultra BrightView Infinity Display (1920x1080)</td> </tr> <tr> <th>Grafična kartica</th> <td>AMD Radeon™ HD 6850 Graphics</td> </tr> <tr> <th>Optična enota</th> <td>SuperMulti DVD-RW Double Layer</td> </tr> <tr> <th>USB 2.0</th> <td>2x</td> </tr> <tr> <th>USB 3.0</th> <td>1x</td> </tr>    <tr> <th>eSATA</th> <td>da</td> </tr> <tr> <th>HDMI</th> <td>da</td> </tr> <tr> <th>WiFi</th> <td>da</td> </tr> <tr> <th>Bluetooth</th> <td>da</td> </tr> <tr> <th>WWAN</th> <td>ne</td> </tr> <tr> <th>Spletna kamera</th> <td>da</td> </tr> <tr> <th>Card Reader</th> <td>da</td> </tr> <tr> <th>Express Card</th> <td>ne</td> </tr> <tr> <th>TV kartica</th> <td>ne</td> </tr> <tr> <th>Finger Print</th> <td>ne</td> </tr> <tr> <th>Vhodne naprave</th> <td>brez</td> </tr>     <tr> <th>Operacijski sistem</th> <td>Microsoft Windows 7 Home Premium (64 bit)</td> </tr> <tr> <th>Država uvoza</th> <td>Italijanska tipkovnica (priložene SLO nalepke)</td> </tr>  <tr> <th>Stanje modela</th> <td>HP Renew</td> </tr>     </tbody> </table>
    </opis_detail>
    <garancija_v_mesecih>12</garancija_v_mesecih>
    <cena_v_EUR>1.049,00</cena_v_EUR>
    <proizvajalec>HP</proizvajalec>
    <stanje>na zalogi</stanje>
    <url_foto_artikla>
    http://www.so-doo.si/media/catalog/product/cache/1/image/265x/9df78eab33525d08d6e5fb8d27136e95/c/0/c02034964.jpg.hri_4.jpg
    </url_foto_artikla>
    <vec_fotk_artikla>
    <slika href="http://www.so-doo.si/media/catalog/product/c/0/c02034982.jpg.hri_4.jpg"/>
    <slika href="http://www.so-doo.si/media/catalog/product/c/0/c02034991.jpg.hri_4.jpg"/>
    </vec_fotk_artikla>
    <teza_artikla_v_kg>2.9000</teza_artikla_v_kg>
    </artikel>

そして、これは私が持ちたいCSVファイルです - 一部のデータだけでなく、XMLからのすべてのデータをヘッダーにします:(

<!-- language: lang-csv -->

koda    naziv   kategorija  podkategorija   v_akciji    kosovnost   opis    opis_detail garancija_v_mesecih cena_v_EUR  proizvajalec    stanje  password    url_foto_artikla    vec_fotk_artikla

私はこれを試しました:

// The order here determines the order in the output CSV file
$columns = array(
    'koda',
    'naziv',
    'kategorija',
    'podkategorija',
    'v_akciji',
    'kosovnost'
);

// This will be used later on to correctly sort in the attribute values
// Note: the third paramter of "array_fill" determines what value to use
// in case a node lacks an attribute
$csv_blueprint = array_combine(
    $columns,
    array_fill(0, count($columns), '')
);

$data = array($columns);
$filexml = 'so_feed.xml';

if ( !file_exists($filexml) ) {
    // Do some error routine
} else {
    $xml = simplexml_load_file($filexml);
    $artikel = $xml->artikel;

    if ( !count($artikel) ) {
        // Stop processing 'cause there's nothing to do
    } else {
        foreach ( $artikel as $item ) {
            // Clone the row blueprint to leave the original unspoiled
            $row = $csv_blueprint;

また、私はこれを試しました:

$xml = simplexml_load_file($filexml);
//$artikel = $xml->artikel;
$ponudbas = $xml->ponudba;
...
    foreach ( $ponudbas as $ponudba ) {
        // Clone the row blueprint to leave the original unspoiled
        $row = $csv_blueprint;

ただし、どちらのシナリオでも、XML からのすべてのデータを解析するわけではありません。私は何をすべきかわからない:(

4

1 に答える 1

0

XML がコピーしたとおりである場合、それは有効な XML ドキュメントではありません。最後に がありません</ponudba>

考慮すべきもう1つのことは、XML形式が要素内のデータであることです。あなたの場合、2つの要素で二重引用符 '' が使用されていることがわかります(17 '')。これにより、特殊なケースで解析エラーが発生することがあります。本当にそれらを使用したい場合は、CDATA ブロック内のデータを使用してそれらの特殊文字をエスケープすることをお勧めします。

編集: XML 要素内に HTML 要素が含まれていることを確認しました。そのような XML 要素には CDATA ブロックを使用することをお勧めします。

より簡単な場合は、XML を JSON に変換し、それを直接 php オブジェクトにデコードできます。

$json = json_encode($xml);
$data = json_decode($json, TRUE);

csv ファイルを書き戻したい場合は、fputcsv の使用を検討する必要があります (http://php.net/manual/fr/function.fputcsv.php)。

EDIT 2 簡単なテストを試してください:

使用する:

$file='file.xml';
$xml = simplexml_load_file($file);

foreach ($xml->artikel as $art)
{    
    echo $art->opis_detail;
}

これは以下のみを出力します:

HP ENVY 17-2199el, Intel Core i7-2630QM (2.0 GHz), 17.3'' FHD AG LED 3D, 8 GB DDR3 (2x 4 GB), 1 TB, BluRay, ATI Radeon HD6850 1024 MB, WiFi, Bluetooth, Webcam, 3D glasses, Microsoft Windows 7 Home Premium (64 bit)

ここで、ノードの XML で CDATA 要素を使用すると、次のようになります。

<opis_detail><![CDATA[HP ENVY 17-2199el, Intel Core i7-2630QM (2.0 GHz), 17.3'' FHD AG LED 3D, 8 GB DDR3 (2x 4 GB), 1 TB, BluRay, ATI Radeon HD6850 1024 MB, WiFi, Bluetooth, Webcam, 3D glasses, Microsoft Windows 7 Home Premium (64 bit)<br/><table> <col width="25%" /> <col /> <tbody> <tr> <th>Procesor</th> <td>Intel® Core™ i7-2630QM / 2.00 GHz / Quad-Core</td> </tr> <tr> <th>Delovni pomnilnik</th> <td>8 GB DDR3</td> </tr> <tr> <th>Trdi disk</th> <td>1 TB (1000 GB) / 5400 / SATA</td> </tr> <tr> <th>LCD zaslon</th> <td>43,9 cm (17,3'') Full HD HP Ultra BrightView Infinity Display (1920x1080)</td> </tr> <tr> <th>Grafična kartica</th> <td>AMD Radeon™ HD 6850 Graphics</td> </tr> <tr> <th>Optična enota</th> <td>SuperMulti DVD-RW Double Layer</td> </tr> <tr> <th>USB 2.0</th> <td>2x</td> </tr> <tr> <th>USB 3.0</th> <td>1x</td> </tr>    <tr> <th>eSATA</th> <td>da</td> </tr> <tr> <th>HDMI</th> <td>da</td> </tr> <tr> <th>WiFi</th> <td>da</td> </tr> <tr> <th>Bluetooth</th> <td>da</td> </tr> <tr> <th>WWAN</th> <td>ne</td> </tr> <tr> <th>Spletna kamera</th> <td>da</td> </tr> <tr> <th>Card Reader</th> <td>da</td> </tr> <tr> <th>Express Card</th> <td>ne</td> </tr> <tr> <th>TV kartica</th> <td>ne</td> </tr> <tr> <th>Finger Print</th> <td>ne</td> </tr> <tr> <th>Vhodne naprave</th> <td>brez</td> </tr>     <tr> <th>Operacijski sistem</th> <td>Microsoft Windows 7 Home Premium (64 bit)</td> </tr> <tr> <th>Država uvoza</th> <td>Italijanska tipkovnica (priložene SLO nalepke)</td> </tr>  <tr> <th>Stanje modela</th> <td>HP Renew</td> </tr>     </tbody> </table>]]>
    </opis_detail>

これにより、次のように出力されます。

HP ENVY 17-2199el, Intel Core i7-2630QM (2.0 GHz), 17.3'' FHD AG LED 3D, 8 GB DDR3 (2x 4 GB), 1 TB, BluRay, ATI Radeon HD6850 1024 MB, WiFi, Bluetooth, Webcam, 3D glasses, Microsoft Windows 7 Home Premium (64 bit)
Procesor    Intel® Core™ i7-2630QM / 2.00 GHz / Quad-Core
Delovni pomnilnik   8 GB DDR3
Trdi disk   1 TB (1000 GB) / 5400 / SATA
LCD zaslon  43,9 cm (17,3'') Full HD HP Ultra BrightView Infinity Display (1920x1080)
GrafiÄna kartica    AMD Radeonâ„¢ HD 6850 Graphics
OptiÄna enota   SuperMulti DVD-RW Double Layer
USB 2.0 2x
USB 3.0 1x
eSATA   da
HDMI    da
WiFi    da
Bluetooth   da
WWAN    ne
Spletna kamera  da
Card Reader da
Express Card    ne
TV kartica  ne
Finger Print    ne
Vhodne naprave  brez
Operacijski sistem  Microsoft Windows 7 Home Premium (64 bit)
Država uvoza   Italijanska tipkovnica (priložene SLO nalepke)
Stanje modela   HP Renew

これは欠落しているデータだと思いますか?

于 2012-09-25T15:10:19.970 に答える