Импорт XML-файла в базу данных PostgreSQL

Несколько дней назад Мне удалось экспортировать 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();
}

Надеюсь, этот код кому-нибудь поможет.

1

Решение

Абсолютно невозможно импортировать это с 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-схемы, чем процедурно в коде.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]