将XML文件解析为规范化的数据库模式

时间:2011-10-27 19:56:19

标签: php mysql

我有一个XML文件,我想以规范化的方式解析到数据库中。表二是我创建一对多关系表的想法。名称,标题永远不会为每个文件组更改,但下载路径将不同。

表1

id | name        | title                         | download_path
----------------------------------------------------------------------
1  | FileGroup 1 | This is the first file group  | /this/1/1.zip
2  | FileGroup 1 | This is the first file group  | /this/1/2.zip
3  | FileGroup 2 | This is the second file group | /this/2/1.zip
4  | FileGroup 2 | This is the second file group | /this/2/2.zip
5  | FileGroup 3 | This is the third file group  | /this/3/1.zip

XML文件

<Item>
    <Name>File Group 1</Name>
    <Title>This is the first file group</Title>
    <DownloadPath>/this/1/1.zip</DownloadPath>
</Item>
<Item>
    <Name>File Group 1</Name>
    <Title>This is the first file group</Title>
    <DownloadPath>/this/1/2.zip</DownloadPath>
</Item>
<Item>
    <Name>File Group 2</Name>
    <Title>This is the second file group</Title>
    <DownloadPath>/this/2/1.zip</DownloadPath>
</Item>
<Item>
    <Name>File Group 2</Name>
    <Title>This is the second file group</Title>
    <DownloadPath>/this/2/2.zip</DownloadPath>
</Item>
<Item>
    <Name>File Group 3</Name>
    <Title>This is the third file group</Title>
    <DownloadPath>/this/3/1.zip</DownloadPath>
</Item>

表2

group_id | file_id
-----------------------------
1        |   1
1        |   2
2        |   3
2        |   4
3        |   5

在解析XML时,最好的方法是什么?如果我将XML数据放入一个数组并通过每个项目进行预测,我需要能够动态地对它们进行分组并在表2中创建关系。我确实想到只创建表1然后构建关系表,但即便如此,我也不知道如何最好地将它们分组。我在XML中没有任何内容可以说它们与其他名称和标题分组。每个组可以有任意数量的文件下载路径。

我对XML文件创建没有任何发言权。我只需要处理它。

1 个答案:

答案 0 :(得分:0)

您的表格结构未规范化。您可以更新一个FileGroup / Title行而不更新另一个,这是错误的。相反,FileGroup / Title应该在一个表中,FileGroup / download_path应该在另一个表中。

至于基于xml组织数据库,假设您正在按节点解析xml:

$groups = array();
foreach ($Items as $Item) {
   if (!isset($groups[$Item->Name])) {
      $groups[$Item->Name] = array(
         'title' => $Item->Title
         , 'files' => array();
      );
   }
   $groups[$Item->Name]['files'][] = $Item->DownloadPath;
}

你的例子中的xml也是无效的,所以如果真的如此,那么运气好吧。