我从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
有关如何处理此问题的任何建议吗?
谢谢你和欢呼!
答案 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>
个。