几天前I managed it to export 3 different PgSQL tables into one XML file。现在,我想导入相同的文件。我搜索了大约2个小时,但只找到了将XML导入一个表的解决方案。这是XML的结构
$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();
}
表1包含表3,表2包含表3。
表是XMLWriterElements,列XMLWriterAttributes。
更新:我解决了这个问题并希望向您展示我的结果,如果有人遇到相同或类似的问题:
31444-31444/? E/AndroidRuntime﹕ FATAL EXCEPTION: main
java.lang.ExceptionInInitializerError
我希望,这些代码可以帮助别人。
答案 0 :(得分:1)
绝对不可能使用XMLWriter导入它,因为这是用于XML输出的。你想要XMLReader
,这是一个类似游标的XML解析器。
您需要撤消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模式验证中比在程序中更好地处理。