2015-08-19 151 views
1

几天前I managed it to export 3 different PgSQL tables into one XML file。现在,我想导入相同的文件。我搜索了大约2个小时,但只找到了将XML导入到一个表的解决方案。这里北京时间的XML的结构将XML文件导入PostgreSQL数据库

<?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(); 
} 

我希望,茨艾伦代码将帮助别人。

+0

数据库实际上是一个包含行和列的单个平面表。表将大型数据库分解为单个平面表的子集视图。你的XML有嵌套的表,这很难进入数据库。我将创建一个包含Col1,Col2和Coln的表格,然后将数据输入到单个表格中,而不是将数据输入到三个单独的表格(表格1,表格2和表格3)中。 – jdweng

+0

您已经在更新中粘贴了代码,但没有说明您遇到了什么问题,您得到的错误等。快速浏览一下,我可以看到一些问题:您似乎正在使用MySQL样式标识符用''引用',而不是用'''引用ANSI SQL风格。你也可以根据我的明确建议,*在你的SQL中连接值,并且如果你执行SQL *,则会使你开放SQL注入。 –

+0

如果你仍然卡住不管你在编辑时粘贴的代码有什么问题,都请发布一个新的问题,并附上一个链接回到这个问题的上下文,你遇到问题的代码小节,问题的描述,确切的您收到的错误消息等。你可能会发现你在编写问题的过程中自己解决它。 (我不能很好地跟踪你的代码,似乎有很多重复;你粘贴了它的一部分两次,也许?) –

回答

1

将它与XMLWriter一起导入是绝对不可能的,因为这是针对XML输出的。你想要XMLReader,它是一个类似于光标的pull语法分析器。

您需要改变the logic you used for the output。迭代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 documentation和适当的例子,把那粗糙的逻辑轮廓到手头的任务的实现。同样,您需要阅读PostgreSQL客户端界面上的PHP文档以了解如何执行插入操作。

对后者的免费提示:做不是使用pg_query和字符串连接/插值。使用PDO,或pg_query_params。为什么,请参阅the PHP manual on SQL injection


对于读者想知道我为什么忽略关闭标签:在这种情况下,他们并不重要,除非XML格式不正确,用<table3>里面直接<table1>没有<table2>,或用<table1><table2>,等等。无论如何,这些情况最好通过XML模式验证来处理,而不是在程序中处理。

+0

哦,是的,我的意思是XMLReader。我的错。我会试试这个。预先感谢您的快速和专业anwser。编辑:可悲的是我已经收回了我的30票/天。明天将升级 – TechTreeDev