1

どこから始めればよいでしょうか... XML ファイルはデータベースに入れる必要があります。したがって、XML ノードと 1 つのテーブルのテーブル列の間のマッピングを含む構成配列を作成したいと考えています。

$maps = array(
 // 'node-name'=>'column-name'
 'prod_id'=>'supplier_product_id',
 'description'=>'product_description',
);

$xml=simplexml_load_file($file);

//just a test
foreach ($maps as $node => $col){
 echo 'node ' . $xml->$node . ' is mapped to: ' . $col; //this works
}

サブノードから、この (同じ) テーブルに入れる必要がある情報があります。そこで、次のようにネストされた配列にサブノードを配置することを考えていました。

$maps = array(
 // 'node-name'=>'column-name'
 'prod_id'=>'supplier_product_id',
 'description'=>'product_description',
 // to access $xml->node->subnode;
 'category'=>array(
  'id'=>'category_id',
 ),
);

しかし、今は混乱しています。ネストされた配列を使用して、次のようにノードへのパスを作成するにはどうすればよいですか。 $xml->category->id

私は PHP の初心者であり、うまくいけば、いくつかの助けが私を再び道に立たせてくれるでしょう。すべてのヘルプを歓迎します。事前に感謝します。

4

2 に答える 2

0

これを試して:

<?php
$maps = array(
 // 'node-name'=>'column-name'
 'prod_id'=>'supplier_product_id',
 'description'=>'product_description',
 // to access $xml->node->subnode;
 'category'=>array(
  'id'=>'category_id'
 )
);

function getDataMapping( $maps, $child="" ) {
    global $file;

    $xml=simplexml_load_file($file);

    foreach ($maps as $node => $col) {
        if( is_array( $col ) ) {
            getDataMapping( $col, $node );
        } else {
            if( $child ) {
                echo 'node ' . $xml->{$child}->$node . ' is mapped to: ' . $col; //this works
            } else {
                echo 'node ' . $xml->$node . ' is mapped to: ' . $col; //this works
            }
        }
    }
}

getDataMapping( $maps );
?>

明らかに、入れ子が何レベルも深く実行される場合 (配列内の配列など)、それを再帰関数に変更できます。

お役に立てれば。

于 2012-04-27T07:14:26.323 に答える
0

XML は次のとおりです。

<?xml version="1.0" encoding="ISO-8859-1"?>
<message>
<errorcode>100</errorcode>
<body>
 <jobs>
  <job>
   <id>1</id>
   <description>Nice job at the office</description>
   <hours>40</hours>
   <contact>
    <id>SYL</id>
    <name>Sylvia</name>
    <email>sylvia@mail.com</email>
   </contact>
  </job>
  <job>
   <id>2</id>
   <description>Construction work</description>
   <hours>32</hours>
   <contact>
    <id>HEN</id>
    <name>Hendrik</name>
    <email>hendrik@mail.com</email>
   </contact>
  </job>
 </jobs>
</body>
<attachements>
</attachements>
<filenames>
</filenames>
</message>

実際には2レベル以上読む必要はないことに気づきました。$xml->node と $xml->child->node の両方にアクセスできるので、あなたの答えで十分です。xpath('//job') を使用すると、ベース ノードの入り口をすべてのノードに設定し、それらを反復処理できます。

于 2012-04-27T10:06:58.377 に答える