如何使用多维数组形成指向 XML 子节点的路径


how to form a path to XML subnodes with a multidimensional array

我从哪里开始...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的新手,希望一些帮助能让我再次上路。欢迎所有帮助,提前感谢您。

试试这个:

<?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 );
?>

显然,如果你的嵌套深度很多(数组中的数组等),你可以将其更改为递归函数。

希望这有帮助。

下面是 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->节点和$xml->子节点>节点。使用 xpath('//job'),我可以为所有节点设置一个基本节点入口并迭代它们。