将XML文件导入PostgreSQL数据库

佩格肖

几天前,我设法将3个不同的PgSQL表导出到一个XML文件中现在,我想导入相同的文件。我搜索了大约2个小时,但只找到了将XML导入一个表的解决方案。此处为XML的结构

 <?xml version="1.0" encoding="UTF-8"?>

 <Table1 Col1="xxx" Col2="xxx">
    <Table2 Col1="xxx">
       <Table3 Col1="xxx" Col2="xxx" Coln="xxx"/>
    </Table2>
    <Table2 Col1="xxx"/>
    <Table2 Col1="xxx">
       <Table3 Col1="xxx" Col2="xxx" Coln="xxx"/>
    </Table2>
 </Table1>

表1包含表3,表2包含表3。

这些表是XMLWriterElements,列是XMLWriterAttributes。

更新:如果有人遇到相同或相似的问题,我已解决了该问题,并想向您展示我的结果:

$reader = new XMLReader();

if ($reader->open("tk.xml")) {
    while($reader->read()) {
        if ($reader->nodeType == XMLReader::ELEMENT &&reader->name == 'Table 1') {
            $knr = $reader->getAttribute('Col1');
            $kname = $reader->getAttribute('Col2');

            $SQL = "";
            $SQL .= "SELECT
                        (table1).col1 AS col1, (table1).col2 AS col1
                    FROM
                        table1
                        ";
            $SQL .= "INSERT INTO table1 (";
            $SQL .= "col1, col1";
            $SQL .= ") VALUES (";
            $SQL .= "'".$col1."', '".$col1."'";
            $SQL .= ");".PHP_EOL;
            echo $SQL;


    }
               if ($reader->nodeType == XMLReader::ELEMENT 
                    &&reader->name == 'Table 2') { ......}

                       if ($reader->nodeType == XMLReader::ELEMENT
                            &&reader->name == 'Table 3') { ......}
  }
    $reader->close();
}   

我希望代码可以帮助某人。

克雷格·林格(Craig Ringer)

绝对不可能用XMLWriter导入它,因为那是为了XML输出。您想要XMLReader,这是XML的类似于游标的提取解析器。

您需要反转用于输出的逻辑遍历XML文档。当您看到一个新节点时,将其插入数据库,然后下降到数据库中并保留其ID记录,以便在为内部层插入外键引用时可以使用它。

您的逻辑将类似于以下伪代码说明:

xmldocument = [create a new XMLReader from the XML text]

cur_table1_id = null;
cur_table2_id = null;

element = xmldocument.get_next_element();
do {
   if (element.name == 'Table1')
   {
     insert_table1(element);
     cur_table1_id = element.getAttribute('id');
   }
   else if (element.name == 'Table2')
   {
     insert_table2(element, cur_table1_id);
     cur_table2_id = element.getAttribute('id');
   }
   else if (element.name == 'Table3')
   {
     insert_table3(element, cur_table2_id);
   }

   element = get_next_element();
} while (element != null);

您可以阅读XMLReader API文档和适当的示例,然后将粗略的逻辑概述转变为手头任务的实现。同样,您需要阅读PostgreSQL客户端界面上的PHP文档,以了解如何进行插入。

自由前端对后者:千万不能使用pg_query和字符串连接/插值。使用PDO或pg_query_params有关原因,请参阅有关SQL注入的PHP手册


对于想知道为什么我忽略关闭标签的读者:在这种情况下,除非XML格式不正确,<table3>直接在内部<table1>带有no<table2>或在<table1>内部带有a<table2>,否则它们无关紧要。通过XML模式验证可以更好地处理这些情况。无论如何,在代码中都按程序进行。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章