PHP:Foreach Simlplexml输出

时间:2017-11-17 13:40:25

标签: php arrays xml foreach

我从datamodelling-tool wwwsqldesigner导出了一个xmlfile。它包含所有表,它们的注释,列及其数据类型,主键列等。

我使用simplexml_load_file成功地在php脚本中导入了xml文件,现在我想循环遍历节点/标签以获得3个列表(之后将它们插入到3个表中的数据库中,此时回显就足够了)。

这些清单是: 1)表:datamodel / xml文件中的表名,它们的注释和主键名。 2)列:表的列:columnname,datatype,nullable(如果可能,还有列顺序)。 3)主键列:列名和列顺序。

xml看起来像这样:

<?xml version="1.0" encoding="utf-8" ?>
<sql>
<table x="673" y="237" name="DIM_CUSTOMER">
<row name="CUSTOMER_SID" null="0" autoincrement="1">
<datatype>INTEGER</datatype>
<default>NULL</default><comment>Customer-SK</comment>
</row>
<row name="CUSTOMER_NAME" null="0" autoincrement="0">
<datatype>VARCHAR(30)</datatype>
<default>'NULL'</default><comment>Customername</comment>
</row>
<row name="CUSTOMER_GROUP" null="1" autoincrement="0">
<datatype>VARCHAR(30)</datatype>
<default>NULL</default></row>
<key type="PRIMARY" name="DIM_CUSTOMER_PK">
<part>CUSTOMER_SID</part>
</key>
<comment>Kunden</comment>
</table>
<table x="1150" y="204" name="DIM_PRODUCT">
<row name="PRODUCT_SID" null="0" autoincrement="1">
<datatype>INTEGER</datatype>
<default>NULL</default><comment>Produkt-Sk</comment>
</row>
<row name="PRODUCT_NAME" null="0" autoincrement="0">
<datatype>VARCHAR(30)</datatype>
<default>'NULL'</default><comment>Productname</comment>
</row>
<key type="PRIMARY" name="DIM_PRODUCT_PK">
<part>PRODUCT_SID</part>
</key>
<comment>Product</comment>
</table>
<table x="632" y="499" name="DIM_DATE">
<row name="DATE_ID" null="0" autoincrement="1">
<datatype>DATE</datatype>
<default>'NULL'</default></row>
<row name="YEAR" null="1" autoincrement="0">
<datatype>CHAR(4)</datatype>
<default>NULL</default></row>
<row name="QUARTER" null="1" autoincrement="0">
<datatype>CHAR(2)</datatype>
<default>NULL</default></row>
<row name="MONTH" null="1" autoincrement="0">
<datatype>VARCHAR(2)</datatype>
<default>NULL</default></row>
<key type="PRIMARY" name="DIM_DATE_PK">
<part>DATE_ID</part>
</key>
</table>
<table x="1214" y="511" name="DIM_INVENTORY">
<row name="INVENTORY_SID" null="1" autoincrement="1">
<datatype>INTEGER</datatype>
<default>NULL</default><comment>Inventory SK</comment>
</row>
<row name="INVENTORY_NAME" null="0" autoincrement="0">
<datatype>VARCHAR(30)</datatype>
<default>'NULL'</default><comment>Inventory</comment>
</row>
<key type="PRIMARY" name="DIM_DATE_PK">
<part>INVENTORY_SID</part>
</key>
</table>
<table x="950" y="358" name="FACT_SALES">
<row name="DATE_ID" null="0" autoincrement="0">
<datatype>DATE</datatype>
<default>'NULL'</default><relation table="DIM_DATE" row="DATE_ID" />
</row>
<row name="INVENTORY_SID" null="1" autoincrement="0">
<datatype>INTEGER</datatype>
<default>NULL</default><relation table="DIM_INVENTORY" row="INVENTORY_SID" />
<comment>Inventory SK</comment>
</row>
<row name="PRODUCT_SID" null="0" autoincrement="0">
<datatype>INTEGER</datatype>
<default>NULL</default><relation table="DIM_PRODUCT" row="PRODUCT_SID" />
<comment>Product-Sk</comment>
</row>
<row name="CUSTOMER_SID" null="0" autoincrement="0">
<datatype>INTEGER</datatype>
<default>NULL</default><relation table="DIM_CUSTOMER" row="CUSTOMER_SID" />
<comment>Customer-SK</comment>
</row>
<row name="REVENUE" null="0" autoincrement="0">
<datatype>DECIMAL(10,2)</datatype>
<default>NULL</default></row>
<key type="PRIMARY" name="FACT_SALES_PK">
<part>DATE_ID</part>
<part>INVENTORY_SID</part>
<part>PRODUCT_SID</part>
<part>CUSTOMER_SID</part>
</key>
<comment>Sales</comment>
</table>
</sql>

对于每个数据库表,都有一个标记,其中包含多个标记以及主键和标记的标记。标签本身为每个主键列都有几个标签。

要创建上面提到的3个需要列表,我写了下面的php脚本:

<?php
$xml = simplexml_load_file('C:\xampp\htdocs\sqldesigner\backend\php-mysql\Datamart.xml');

// Tables
echo "+++++++++++++ TABLES +++++++++++++<br>";
foreach ($xml->table as $table) {
        echo "----------------------------------------<br>";
        echo "Tabelle: "  . $table['name']  . "<br>"; //Tabelle
        echo "Primary: "  . $table->key['name']     . "<br>"; //PK
        echo "Comment: "  . $table->comment     . "<br>"; //Table-Comment       

}
// Columns
echo "+++++++++++++ COLUMNS +++++++++++++<br>";
foreach ($xml->table as $table) {

        foreach ($table as $row) {
            echo "Column: "   . $table['name'] . "." . $row['name'] . "<br>";
            echo "Nullable: " . $row["null"]    . "<br>";
            echo "Datatype: " . $row->datatype."<br>";
            echo "Comment: "  . $row->comment . "<br>"; 
            echo "---------------------<br>";
        }           
}

// PK-Columns
echo "+++++++++++++ PRIMARY KEY COLS +++++++++++++<br>";
foreach ($xml->table as $table) {

        foreach ($table as $primarykey) {
            echo "PK-Col.: " . $table['name'] . "." . $primarykey->part . "<br>";

        }
}
?>

不幸的是,列和主键的输出是错误的。它产生空行。所以我的猜测是,从内部的foreach到外部的foreach缺失了。输出如下:

+++++++++++++ TABLES +++++++++++++
----------------------------------------
Tabelle: DIM_CUSTOMER
Primary: DIM_CUSTOMER_PK
Comment: Kunden
----------------------------------------
Tabelle: DIM_PRODUCT
Primary: DIM_PRODUCT_PK
Comment: Product
----------------------------------------
Tabelle: DIM_DATE
Primary: DIM_DATE_PK
Comment: 
----------------------------------------
Tabelle: DIM_INVENTORY
Primary: DIM_DATE_PK
Comment: 
----------------------------------------
Tabelle: FACT_SALES
Primary: FACT_SALES_PK
Comment: Sales
+++++++++++++ COLUMNS +++++++++++++
Column: DIM_CUSTOMER.CUSTOMER_SID
Nullable: 0
Datatype: INTEGER
Comment: Customer-SK
---------------------
Column: DIM_CUSTOMER.CUSTOMER_NAME
Nullable: 0
Datatype: VARCHAR(30)
Comment: Customername
---------------------
Column: DIM_CUSTOMER.CUSTOMER_GROUP
Nullable: 1
Datatype: VARCHAR(30)
Comment: 
---------------------
Column: DIM_CUSTOMER.DIM_CUSTOMER_PK
Nullable: 
Datatype: 
Comment: 
---------------------
Column: DIM_CUSTOMER.
Nullable: 
Datatype: 
Comment: 
---------------------
Column: DIM_PRODUCT.PRODUCT_SID
Nullable: 0
Datatype: INTEGER
Comment: Produkt-Sk
---------------------
Column: DIM_PRODUCT.PRODUCT_NAME
Nullable: 0
Datatype: VARCHAR(30)
Comment: Productname
---------------------
Column: DIM_PRODUCT.DIM_PRODUCT_PK
Nullable: 
Datatype: 
Comment: 
---------------------
Column: DIM_PRODUCT.
Nullable: 
Datatype: 
Comment: 
---------------------
Column: DIM_DATE.DATE_ID
Nullable: 0
Datatype: DATE
Comment: 
---------------------
Column: DIM_DATE.YEAR
Nullable: 1
Datatype: CHAR(4)
Comment: 
---------------------
Column: DIM_DATE.QUARTER
Nullable: 1
Datatype: CHAR(2)
Comment: 
---------------------
Column: DIM_DATE.MONTH
Nullable: 1
Datatype: VARCHAR(2)
Comment: 
---------------------
Column: DIM_DATE.DIM_DATE_PK
Nullable: 
Datatype: 
Comment: 
---------------------
Column: DIM_INVENTORY.INVENTORY_SID
Nullable: 1
Datatype: INTEGER
Comment: Inventory SK
---------------------
Column: DIM_INVENTORY.INVENTORY_NAME
Nullable: 0
Datatype: VARCHAR(30)
Comment: Inventory
---------------------
Column: DIM_INVENTORY.DIM_DATE_PK
Nullable: 
Datatype: 
Comment: 
---------------------
Column: FACT_SALES.DATE_ID
Nullable: 0
Datatype: DATE
Comment: 
---------------------
Column: FACT_SALES.INVENTORY_SID
Nullable: 1
Datatype: INTEGER
Comment: Inventory SK
---------------------
Column: FACT_SALES.PRODUCT_SID
Nullable: 0
Datatype: INTEGER
Comment: Product-Sk
---------------------
Column: FACT_SALES.CUSTOMER_SID
Nullable: 0
Datatype: INTEGER
Comment: Customer-SK
---------------------
Column: FACT_SALES.REVENUE
Nullable: 0
Datatype: DECIMAL(10,2)
Comment: 
---------------------
Column: FACT_SALES.FACT_SALES_PK
Nullable: 
Datatype: 
Comment: 
---------------------
Column: FACT_SALES.
Nullable: 
Datatype: 
Comment: 
---------------------
+++++++++++++ PRIMARY KEY COLS +++++++++++++
PK-Col.: DIM_CUSTOMER.
PK-Col.: DIM_CUSTOMER.
PK-Col.: DIM_CUSTOMER.
PK-Col.: DIM_CUSTOMER.CUSTOMER_SID
PK-Col.: DIM_CUSTOMER.
PK-Col.: DIM_PRODUCT.
PK-Col.: DIM_PRODUCT.
PK-Col.: DIM_PRODUCT.PRODUCT_SID
PK-Col.: DIM_PRODUCT.
PK-Col.: DIM_DATE.
PK-Col.: DIM_DATE.
PK-Col.: DIM_DATE.
PK-Col.: DIM_DATE.
PK-Col.: DIM_DATE.DATE_ID
PK-Col.: DIM_INVENTORY.
PK-Col.: DIM_INVENTORY.
PK-Col.: DIM_INVENTORY.INVENTORY_SID
PK-Col.: FACT_SALES.
PK-Col.: FACT_SALES.
PK-Col.: FACT_SALES.
PK-Col.: FACT_SALES.
PK-Col.: FACT_SALES.
PK-Col.: FACT_SALES.DATE_ID
PK-Col.: FACT_SALES.

Here is how the datamodel from the xml looks like in the wwwsqldesigner

有关如何处理此问题的任何建议吗?

谢谢你和欢呼!

2 个答案:

答案 0 :(得分:0)

这是因为您在没有过滤的情况下迭代所有表节点,请尝试以下解决方案:

<?php
$xml = simplexml_load_file('C:\xampp\htdocs\sqldesigner\backend\php-mysql\Datamart.xml');

// Tables
echo "+++++++++++++ TABLES +++++++++++++<br>";
foreach ($xml->table as $table) {
        echo "----------------------------------------<br>";
        echo "Tabelle: "  . $table['name']  . "<br>"; //Tabelle
        echo "Primary: "  . $table->key['name']     . "<br>"; //PK
        echo "Comment: "  . $table->comment     . "<br>"; //Table-Comment

}
// Columns
echo "+++++++++++++ COLUMNS +++++++++++++<br>";
foreach ($xml->table as $table) {

        foreach ($table as $row) {
            if ($row->getName() != 'row') {
                continue;
            }

            echo "Column: "   . $table['name'] . "." . $row['name'] . "<br>";
            echo "Nullable: " . $row["null"]    . "<br>";
            echo "Datatype: " . $row->datatype."<br>";
            echo "Comment: "  . $row->comment . "<br>";
            echo "---------------------<br>";
        }
}

// PK-Columns
echo "+++++++++++++ PRIMARY KEY COLS +++++++++++++<br>";
foreach ($xml->table as $table) {

        foreach ($table as $primarykey) {
            if ($primarykey->getName() != 'key') {
                continue;
            }

            echo "PK-Col.: " . $table['name'] . "." . $primarykey->part . "<br>";

        }
}
?>

答案 1 :(得分:0)

与在外部循环中使用Vue.use(AtComponents) 的方式相同,您还需要使用内部循环来选择$xml->table元素。

所以你的内在的foreach循环变成了......

<row>

正如您所看到的,您获取了foreach ($table->row as $row) { 的所有子元素,这会将其限制为<table>个。