将 XML 文件导入 PostgreSQL 数据库
Import XML file into PostgreSQL Database
几天前。现在,我想导入相同的文件。我搜索了大约 2 个小时,但只找到了将 XML 导入一个 Table 的解决方案。这是 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>
Table 1 包含 Table 3 并且 table 2 包含 Table 3.
table 是 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();
}
我希望这些代码对某人有所帮助。
绝对不可能用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 documentation 和适当的示例,并将粗略的逻辑大纲转化为手头任务的实现。同样,您需要阅读有关 PostgreSQL 客户端界面的 PHP 文档,了解如何进行插入。
关于后者的免费提示:不要 使用pg_query
和字符串concatenation/interpolation。使用 PDO,或 pg_query_params
。原因见 the PHP manual on SQL injection.
对于想知道为什么我忽略关闭标签的读者:在这种情况下,它们无关紧要,除非 XML 格式不正确,<table3>
直接在 <table1>
内,没有 <table2>
,或者在 <table2>
中使用 <table1>
,等等。无论如何,与在代码中程序化相比,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>
Table 1 包含 Table 3 并且 table 2 包含 Table 3.
table 是 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();
}
我希望这些代码对某人有所帮助。
绝对不可能用XMLWriter导入这个,因为那是XML输出。您需要 XMLReader
,它是 XML.
你需要反转
您的逻辑类似于以下伪代码解释:
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
和字符串concatenation/interpolation。使用 PDO,或 pg_query_params
。原因见 the PHP manual on SQL injection.
对于想知道为什么我忽略关闭标签的读者:在这种情况下,它们无关紧要,除非 XML 格式不正确,<table3>
直接在 <table1>
内,没有 <table2>
,或者在 <table2>
中使用 <table1>
,等等。无论如何,与在代码中程序化相比,XML 模式验证可以更好地处理这些情况。