1

我从哪里开始... XML 文件需要进入数据库。因此,我想创建一个配置数组,其中包含 XML 节点和一个表的表列之间的映射。

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