Несколько дней назад Мне удалось экспортировать 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();
}
Надеюсь, этот код кому-нибудь поможет.
Абсолютно невозможно импортировать это с XMLWriter, потому что это для вывода XML. Ты хочешь XMLReader
, который похож на курсор парсера для XML.
Вам нужно повернуть вспять логика, которую вы использовали для вывода. Перебирать документ 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 документация и соответствующие примеры и превратить эту грубую логическую схему в реализацию поставленной задачи. Точно так же вам нужно прочитать документацию по PHP на клиентском интерфейсе PostgreSQL, чтобы понять, как выполнять вставки.
Бесплатный совет по последнему: сделать не использование pg_query
и конкатенация / интерполяция строк. Использовать PDO или pg_query_params
, Почему, смотрите руководство PHP по SQL-инъекции.
Для читателей, задающихся вопросом, почему я проигнорировал закрывающие теги: в этом случае они не имеют значения, если XML не сформирован, с <table3>
прямо внутри <table1>
без <table2>
или с <table1>
внутри <table2>
и т. д. Эти случаи лучше обрабатываются проверкой XML-схемы, чем процедурно в коде.
Других решений пока нет …