Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 将XML文件导入PostgreSQL数据库_Php_Sql_Xml_Postgresql_Xmlwriter - Fatal编程技术网

Php 将XML文件导入PostgreSQL数据库

Php 将XML文件导入PostgreSQL数据库,php,sql,xml,postgresql,xmlwriter,Php,Sql,Xml,Postgresql,Xmlwriter,几天前。现在,我想导入相同的文件。我搜索了大约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>

几天前。现在,我想导入相同的文件。我搜索了大约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>

我希望,这些代码能帮助一些人。

使用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);
这取决于您阅读适当的示例,并将粗略的逻辑大纲转化为手头任务的实现。类似地,您需要阅读PostgreSQL客户机接口上的PHP文档,以了解如何进行插入

关于后者的免费提示:不要使用
pgu查询和字符串连接/插值。使用PDO,或
pg_query_params
。至于原因,请参见



对于想知道我为什么忽略关闭标记的读者:在本例中,它们无关紧要,除非XML格式不正确,直接在
中使用
而不使用
,或者在
中使用
,等等。这些情况通过XML模式验证处理比在代码中使用过程更好,无论如何。

数据库实际上是一个包含行和列的单一平面表。表将大型数据库拆分为视图,这些视图是单个平面表的子集。您的XML具有嵌套表,很难进入数据库。我会创建一个包含Col1、Col2和Coln的单表,然后将数据输入到单表中,而不是将数据输入到三个单独的表(表1、表2和表3)中。您在更新中粘贴了代码,但没有显示您遇到了什么问题、出现了什么错误,等等。快速看一眼,我可以看到一些问题:您似乎在使用MySQL样式的标识符引用
,而不是ANSI SQL样式的引用
"`. 根据我的明确建议,您还将连接SQL中的值,并在执行该SQL时为SQL注入留有很大的空间。如果您仍然无法解决在编辑中粘贴的代码中存在的任何问题,请发布一个新问题,并将其链接回此问题,以供参考,您遇到问题的代码部分、问题描述、您收到的确切错误消息等。您可能会发现,在编写问题的过程中,您自己解决了问题。(我不能很好地理解你的代码,似乎有很多重复;你可能粘贴了一部分两次吗?)好的,对不起,我不理解这一部分,因为我对PHP比较陌生。我忘了保存编辑,在那里我写了问题。我重新做了一遍,然后把我的结果发布了好吧,我重新思考了一下,在OP中写下了工作代码,也许有些事情我可以做得更好?很抱歉我的问题,但我三周前开始使用PHP哦,是的,我是说XMLReader。我的错。我会试试这个。提前感谢您的快速和专业anwser。编辑:可悲的是,我已经记录了我每天的30票。你明天会投票吗
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);