2016-12-28 6 views
0

я пытаюсь вставить в данных PostgreSQL таблицы из XML Это пример XML:Импорт XML-данных в PostgreSQL

<?xml version="1.0" encoding="UTF-8"?> 
<ActualStatuses> 
    <ActualStatus ACTSTATID="0" NAME="Not actual" /> 
    <ActualStatus ACTSTATID="1" NAME="Актуальный" /> 
</ActualStatuses> 

Для загрузки XML я использую эту функцию:

CREATE OR REPLACE FUNCTION bytea_import(IN p_path text, OUT p_result bytea) 
    RETURNS bytea AS 
$BODY$ 
declare 
    l_oid oid; 
    r record; 
begin 
    p_result := ''; 
    select lo_import(p_path) into l_oid; 
    for r in (select data 
      from pg_largeobject 
      where loid = l_oid 
      order by pageno) loop 
    p_result = p_result || r.data; 
    end loop; 
    perform lo_unlink(l_oid); 
end;$BODY$ 
    LANGUAGE plpgsql VOLATILE 
    COST 100; 
ALTER FUNCTION bytea_import(text) 
    OWNER TO postgres; 

Для значения вставки из XML к PostGreSQL таблице я использую тонкий запрос:

INSERT INTO actualstatuses(
    SELECT 
     (xpath('//ActualStatus/@ACTSTATID', myTempTable))[1]::text::bigint AS ACTSTATID, 
     (xpath('//ActualStatus/@NAME', myTempTable))[1]::text AS NAME 
    FROM 
     unnest(xpath('//ActualStatus', convert_from(public.bytea_import('C:/fias/update/AS_ACTSTAT.XML'), 'utf8')::xml)) AS myTempTable); 

И есть ошибка синтаксического анализатора:

invalid XML content 
SQL-status: 2200N 
Entity: line 1: parser error : XML declaration allowed only at the start of the document 
<?xml version="1.0" encoding="utf-8"?><AddressObjectTypes><AddressObjectType 

Но если я удалю <?xml version="1.0" encoding="utf-8"?> в XML, эта работа замечательная. У меня около 20 XML-файлов, некоторые из которых очень большие. Как избавиться от этой ошибки?

+0

Работы для меня;). Пожалуйста, напишите более подробную информацию: особенно, как вы пытаетесь импортировать несколько файлов. –

+0

@ RadekPostołowicz Я создаю для всех файлов sql-запрос, но я думаю, что это можно реализовать через цикл –

ответ

0
INSERT INTO actualstatuses(
    SELECT 
     (xpath('//ActualStatus/@ACTSTATID', myTempTable))[1]::text::bigint AS ACTSTATID, 
     (xpath('//ActualStatus/@NAME', myTempTable))[1]::text AS NAME 
    FROM 
     unnest(xpath('//ActualStatus', replace(convert_from(bytea_import('C:/fias/update/AS_ACTSTAT.XML'), 'utf8'),'<?xml version="1.0" encoding="utf-8"?>','')::xml)) AS myTempTable); 
Смежные вопросы