Importuj pliki XML w PostgreSQL
Naprawdę mam wiele plików XML, które chciałbym zaimportować do
XML_Data <!-- Code--> Tabela:
create table xml_data(result xml);
W tym celu mam prosty skrypt bash z cyklem:
#!/bin/sh
FILES=/folder/with/xml/files/*.xml
for f in $FILES
do
psql psql -d mydb -h myhost -U usr -c \'\copy xml_data from $f \'
done
Spróbuje to jednak zaimportować każdą linię każdego pliku jako oddzielnego ciągu. Prowadzi to do błędu:
ERROR: invalid XML content
CONTEXT: COPY address_results, line 1, column result: "<?xml version="1.0" encoding="UTF-8"?>"
Rozumiem, dlaczego to się nie powiedzie, ale nie mogę dowiedzieć się, jak sprawić, aby
\ copyzaimportował cały plik naraz w jednej linii.
Nie znaleziono powiązanych wyników
Zaproszony:
Aby odpowiedzieć na pytania, Zaloguj się lub Zarejestruj się
4 odpowiedzi
Anonimowy użytkownik
Potwierdzenie od:
Dla tych, którzy potrzebują przykładu roboczego:
Lub z mniejszym hałasem
W tym przykładzie plik XML (MyData.xml):
Uwaga:
MyData.xml musi znajdować się w katalogu PG_DATA (katalog nadrzędny pg_stat).
Na przykład /var/lib/postgresql/9.3/min/mydata.xml
To wymaga PostGreSQL 9.1+
Podsumowując, możesz to osiągnąć bez takich plików:
Należy pamiętać, że w przeciwieństwie do MS-SQL, XPath Tekst () zwraca NULL przez NULL, a nie pusty ciąg.
Jeśli z jakiegokolwiek powodu musisz wyraźnie sprawdzić dostępność NULL, możesz użyć
[Nie (@xsi: nil = "true")]
, do którego musisz przekazać tablicę przestrzeni nazw, ponieważ w Drugi przypadek otrzymasz błąd (jednak możesz pominąć wszystkie przestrzenie przestrzeni nazw, z wyjątkiem XSI).Możesz również sprawdzić, czy pole jest zawarte w tekście XML, wykonując następujące kroki
,xmlexists('//xmlEncodeTest[1]' PASSING BY REF myTempTable.myXmlColumn) AS c1e
Na przykład, gdy przekazujesz wartość XML do zapisanej procedury/funkcji dla Cruda.
(patrz wyżej)
Ponadto zauważ, że właściwy sposób przesyłania wartości Null do XML jest & LT; ElementName XSI: Nil = "True"/& GT; , a nie lub nic. Nie ma prawidłowego sposobu przesyłania null w atrybutach (możesz tylko pominąć atrybut, ale następnie staje się trudny/powoli określić liczbę kolumn i ich nazw w dużym zestawie danych).
na przykład
(jest to bardziej kompaktowe, ale bardzo złe, jeśli musisz go zaimportować, zwłaszcza jeśli z plików XML z wieloma GB danych - zobacz świetny przykład w zrzutach danych stackoverflow)
Anonimowy użytkownik
Potwierdzenie od:
o wiele szybciej
i dużo bardziej niezawodne.
<pre class="lang-sql prettyprint-override">
Potrzebujesz praw
superuser
a plik powinien być
lokalnie na serwerze
DB, w niedrogim katalogu.
Pełny przykład kodu z dodatkowymi objaśnieniami i linkami:
Anonimowy użytkownik
Potwierdzenie od:
Napotkałem ten problem z moimi danymi i od dłuższego czasu szukałem rozwiązania; jego odpowiedź była dla mnie najbardziej pomocna.
Przykładowy plik danych,
:
Na bok:
Plik źródłowy XML miał adres URL w elemencie dokumentu
To uniemożliwiło XPath , aby przeanalizować dane. On
będzie
praca (brak komunikatów o błędach), ale relacja/tabela jest pusta:
Ponieważ oryginalny plik ma 3,4 GB, zdecydowałem się edytować ten wiersz za pomocą :
[
Dodawanie 2 (instruuje SED Edytuj "Linia 2") również zbieg okoliczności, w tym przypadku podwaja szybkość wykonania komendy .
]
My Folder Data Postgre (PSQL: Pokaż dane_directory; )
Tak więc, podobnie jak , musiałem skopiować tam mój plik danych XML i do użytku w PostgreSQL:
Skrypt ( hmdb_test.sql ):
Wykonanie, wyjście (w ):
Anonimowy użytkownik
Potwierdzenie od:
Oczywiście nie jest to bardzo dobry pomysł, gdy masz wartości wieloinformowane w XML. Na szczęście to nie jest mój przypadek.
Aby zaimportować wszystkie pliki XML do folderu, możesz użyć tego skryptu bash: