2015-08-19 5 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.

UPDATE: Я решил эту проблему и хочу показать вам мои результаты, если кто-то га такую ​​же или подобную проблему:

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

Я надеюсь, Thos код поможет кому-то.

+0

База данных - это действительно одна плоская таблица со строками и столбцами. Таблицы разбивают большую базу данных на представления, которые являются подмножествами одной плоской таблицы. В вашем XML есть вложенные таблицы, которые трудно вводить в базу данных. Я бы создал единую таблицу, которая содержит Col1, Col2 и Coln, а затем вводит данные в единую таблицу, а не вводит данные в три отдельные таблицы (таблица 1, таблица 2 и таблица 3). – jdweng

+0

Вы вставили код в обновление, но не указали, какая у вас проблема, какие ошибки вы получаете и т. Д. С быстрым взглядом я вижу ряд проблем: похоже, вы используете идентификатор стиля MySQL цитируя с помощью ', а не ANSI SQL-стиль, цитирующийся с' ''. Вы также против моего явного совета * конкатенируете значения в вашем SQL и оставляете вас широко открытыми для SQL-инъекций, если вы выполняете этот SQL *. –

+0

Если вы все еще застряли с какой бы проблемой вы ни сталкивались с этим кодом, который вы вставляли в редактирование, отправьте новый вопрос со ссылкой на эту ссылку для контекста, подраздел кода, с которым у вас возникли проблемы, описание проблемы, точное сообщение об ошибке, которое вы получаете, и т. д.Вероятно, вы обнаружите, что сами решаете это в процессе написания проблемы. (Я не могу хорошо следовать вашему коду, похоже, много дублирования, вы можете вставить его часть дважды, может быть?) –

ответ

1

Это абсолютно невозможно импортировать с помощью XMLWriter, потому что это для вывода XML. Вы хотите XMLReader, который представляет собой курсорный анализатор тяги для XML.

Необходимо обратить вспять the logic you used for the output. Итерации над 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 и соответствующие примеры и превратить эту грубую логическую схему в реализации поставленной задачи. Аналогично, вам нужно будет прочитать документацию PHP на клиентском интерфейсе PostgreSQL, чтобы выяснить, как делать вставки.

Бесплатный совет на последнем: do не использование pg_query и строка конкатенации/интерполяции. Используйте PDO, или pg_query_params. Для чего, см. the PHP manual on SQL injection.


Для читателей интересно, почему я проигнорировал близкие теги: В этом случае они не имеют значения, если XML не уродливы, с <table3> непосредственно внутри <table1>, без <table2>, или с <table1> Внутри <table2> и т.д. В любом случае эти случаи лучше обрабатываются с помощью проверки схемы XML, чем в процедуре кода.

+0

О, да, я имел в виду XMLReader. Виноват. Я попробую это. Заранее благодарю вас за ваш быстрый и профессиональный андерс. Редактировать: К сожалению, я уже записал свои 30 голосов/день. Выберет это завтра – TechTreeDev

 Смежные вопросы

  • Нет связанных вопросов^_^