2017-11-17 10 views
0

データモデリングツールwwwsqldesignerからエクスポートされたxmlファイルがあります。これには、すべての表、そのコメント、列とそのデータ型、主キー列などが含まれます。PHP:Foreach Simlplexml出力

私はxmlファイルをPHPのスクリプトで正常にsimplexml_load_fileでインポートしましたが、今度は3つのリストを取得するためにノード/タグをループしたいと思います(3つのテーブルのデータベースに挿入してください) 。

これらのリストは次のとおりです。 1)テーブル:datamodel/xml-fileのテーブル名、そのコメントと主キーの名前。 2)列:その表の列:列名、データ型、NULL可能(可能な場合は列の順序)。 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> 

複数のタグと、主キーとタグ用のタグを含むタグが存在しています。タグ自体には、すべての主キー列に対して複数のタグがあります。 I上記の3つのに必要なリストを作成する

は、PHPスクリプトを書きましたfollwing:

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

任意の提案は、どのようにこの問題を処理するために?

ありがとうございます!

答えて

0

あなたは、フィルタリングなしですべてのテーブルのノードを反復しているので、以下のソリューション試してください起こっザッツ:あなたの外側のループで$xml->tableを使用するのと同じように

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

     } 
} 
?> 
+0

ありがとう、それは私の問題を解決しました。 – guhl

0

を、あなたはまた、内側を取得する必要がありますループを実行して、<row>要素を選択します。

だからあなたの内側のforeachループになる。..

foreach ($table->row as $row) { 

あなたが見ることができるように、あなたは<table>のすべてのサブ要素を拾って、これはちょうど<row>のものに限らせて頂きます。

+0

残念ながら、私はそれを働かせることができませんでした。私はそれを前に試しました。 – guhl