Java 将xml模式导入postgres以自动创建一个表,然后用xml文件填充它?

Java 将xml模式导入postgres以自动创建一个表,然后用xml文件填充它?,java,sql,xml,postgresql,Java,Sql,Xml,Postgresql,我有一个巨大的xml文件,除非我将其导入数据库,否则无法打开它。我用Postgres来做这个。我有一个与此数据文件相匹配的模式。列太多,因此我想自动执行从该架构创建表的过程,然后从计算机上的本地驱动器导入数据文件以填充该表。我该怎么做? 我在SO上看到了很多答案,但我无法正确理解这一点。此外,我没有超级用户权限,因此必须解决这一问题 以下是架构文件的外观: > <?xml version="1.0" encoding="UTF-8"?> <xs:schema > x

我有一个巨大的xml文件,除非我将其导入数据库,否则无法打开它。我用Postgres来做这个。我有一个与此数据文件相匹配的模式。列太多,因此我想自动执行从该架构创建表的过程,然后从计算机上的本地驱动器导入数据文件以填充该表。我该怎么做? 我在SO上看到了很多答案,但我无法正确理解这一点。此外,我没有超级用户权限,因此必须解决这一问题

以下是架构文件的外观:

> <?xml version="1.0" encoding="UTF-8"?> <xs:schema
> xmlns:xs="http://www.w3.org/2001/XMLSchema"
> elementFormDefault="qualified"
>     targetNamespace="http://www.drugbank.ca" xmlns="http://www.drugbank.ca">
>     <xs:element name="drugbank" type="drugbank-type">
>         <xs:annotation>
>             <xs:documentation>This is the root element for the DrugBank database schema. DrugBank is a database on drug and
> drug-targets.</xs:documentation>
>         </xs:annotation>
>     </xs:element>
>     <xs:complexType name="drugbank-type">
>         <xs:annotation>
>             <xs:documentation>This is the root element type for the DrugBank database schema.</xs:documentation>
>         </xs:annotation>
>         <xs:sequence>
>             <xs:element name="drug" type="drug-type" maxOccurs="unbounded"/>
>         </xs:sequence>
>         <xs:attribute name="version" type="xs:string" use="required">
>             <xs:annotation>
>                 <xs:documentation>The DrugBank version for the exported XML file.</xs:documentation>
>             </xs:annotation>
>         </xs:attribute>
>         <xs:attribute name="exported-on" type="xs:date" use="required">
>             <xs:annotation>
>                 <xs:documentation>The date the XML file was exported.</xs:documentation>
>             </xs:annotation>
>         </xs:attribute>
>     </xs:complexType>
>     <xs:complexType name="drug-type">
>         <xs:sequence>
>             <xs:element maxOccurs="unbounded" minOccurs="1" name="drugbank-id"
>                 type="drugbank-drug-salt-id-type"> </xs:element>
>             <xs:element name="name" type="xs:string"/>
>             <xs:element name="description" type="xs:string"/>
>             <xs:element name="cas-number" type="xs:string"/>
>             <xs:element name="unii" type="xs:string"/>
>             <xs:element name="average-mass" type="xs:float" minOccurs="0"/>
>             <xs:element name="monoisotopic-mass" type="xs:float" minOccurs="0"/>
>             <xs:element name="state" type="state-type" minOccurs="0"/>
>             <xs:element name="groups" type="group-list-type"/>
>             <xs:element name="general-references" type="reference-list-type"/>
>             <xs:element name="synthesis-reference" type="xs:string"/>
>             <xs:element name="indication" type="xs:string"/>
>             <xs:element name="pharmacodynamics" type="xs:string"/>
>             <xs:element name="mechanism-of-action" type="xs:string"/>
>             <xs:element name="toxicity" type="xs:string"/>
>             <xs:element name="metabolism" type="xs:string"/>
>             <xs:element name="absorption" type="xs:string"/>
>             <xs:element name="half-life" type="xs:string"/>
>             <xs:element name="protein-binding" type="xs:string"/>
>             <xs:element name="route-of-elimination" type="xs:string"/>
>             <xs:element name="volume-of-distribution" type="xs:string"/>
>             <xs:element name="clearance" type="xs:string"/>
>             <xs:element name="classification" type="classification-type" minOccurs="0"/>
>             <xs:element name="salts" type="salt-list-type"/>
>             <xs:element name="synonyms" type="synonym-list-type"/>
>             <xs:element name="products" type="product-list-type"/>
>             <xs:element name="international-brands" type="international-brand-list-type"/>
>             <xs:element name="mixtures" type="mixture-list-type"/>
>             <xs:element name="packagers" type="packager-list-type"/>
>             <xs:element name="manufacturers" type="manufacturer-list-type"/>
>             <xs:element name="prices" type="price-list-type"/>
>             <xs:element name="categories" type="category-list-type"/>
>             <xs:element name="affected-organisms" type="affected-organism-list-type"/>
>             <xs:element name="dosages" type="dosage-list-type"/>
>             <xs:element name="atc-codes" type="atc-code-list-type"/>
>             <xs:element name="ahfs-codes" type="ahfs-code-list-type"/>
>             <xs:element name="pdb-entries" type="pdb-entry-list-type"/>
>             <xs:element name="fda-label" type="xs:anyURI" minOccurs="0"/>
>             <xs:element name="msds" type="xs:anyURI" minOccurs="0"/>
>             <xs:element name="patents" type="patent-list-type"/>
>             <xs:element name="food-interactions" type="food-interaction-list-type"/>
>             <xs:element name="drug-interactions" type="drug-interaction-list-type"/>
>             <xs:element minOccurs="0" name="sequences" type="sequence-list-type"/>
>             <xs:element minOccurs="0" name="calculated-properties" type="calculated-property-list-type"/>
>             <xs:element name="experimental-properties" type="experimental-property-list-type"/>
>             <xs:element name="external-identifiers" type="external-identifier-list-type"/>
>             <xs:element name="external-links" type="external-link-list-type"/>
>             <xs:element name="pathways" type="pathway-list-type"/>
>             <xs:element name="reactions" type="reaction-list-type"/>
>             <xs:element name="snp-effects" type="snp-effect-list-type"/>
>             <xs:element name="snp-adverse-drug-reactions" type="snp-adverse-drug-reaction-list-type"/>
>             <xs:element name="targets" type="target-list-type"/>
>             <xs:element name="enzymes" type="enzyme-list-type"/>
>             <xs:element name="carriers" type="carrier-list-type"/>
>             <xs:element name="transporters" type="transporter-list-type"/>
>         </xs:sequence>
>xmlns:xs=”http://www.w3.org/2001/XMLSchema"
>elementFormDefault=“合格”
>targetNamespace=”http://www.drugbank.ca“xmlns=”http://www.drugbank.ca">
>     
>         
>这是DrugBank数据库模式的根元素。DrugBank是一个关于药物和药物的数据库
>药物靶点。
>         
>     
>     
>         
>这是DrugBank数据库架构的根元素类型。
>         
>         
>             
>         
>         
>             
>导出的XML文件的药库版本。
>             
>         
>         
>             
>导出XML文件的日期。
>             
>         
>     
>     
>         
>type=“drugbank药盐id类型”>
>             
>             
>             
>             
>             
>             
>             
>             
>             
>             
>             
>             
>             
>             
>             
>             
>             
>             
>             
>             
>             
>             
>             
>             
>             
>             
>             
>             
>             
>             
>             
>             
>             
>             
>             
>             
>             
>             
>             
>             
>             
>             
>             
>             
>             
>             
>             
>             
>             
>             
>             
>             
>             
>             
>         

这只是其中的一部分。这是一个巨大的文件。非常感谢您提供任何帮助/指导。

将XML文件导入PostgreSQL的方法可能有上千种,但我发现有一种方法非常容易实现,并且已经在大型XML文档(120GB+)中进行了测试

根据XML文件的大小,考虑拆分它。这样做的一个极好的工具是。此命令将

file.xml
拆分为最大为100MB的较小文件:

xml_split -n 5 -l 1 -s 100MB file.xml
一旦将文件拆分为合理大小,就可以开始导入它们,而不会有内存不足的风险

让我们考虑下面的XML文件结构…

<?xml version="1.0"?>
<t>
    <foo>
        <id j="a">1</id>
        <val>bar1</val>
    </foo>
    <foo>
        <id j="b">8</id>
        <val>bar1</val>
    </foo>
    <foo>
        <id j="c">5</id>
        <val>bar1</val>
    </foo>
    <foo>
        <id j="b">2</id>
    </foo>
</t>
下面的代码将XML文件导入到一个临时表中,并通过节点
使用(aka WITH子句)将其导入表
t
。命令
perl-pe's/\n/\\n/g'
将换行符替换为
\\n
,这样就不会出现
过早结束数据的情况
异常:

#!/bin/bash

psql testdb -c "CREATE UNLOGGED TABLE tmp (entry xml);"

for f in /path/to/your/files/;do

    cat $f | perl -pe 's/\n/\\n/g' |psql testdb -c "COPY tmp FROM STDIN;"
    psql testdb -c "
    WITH j AS (
      SELECT UNNEST(XPATH('//t/foo',entry)) AS entry FROM tmp
    )
      INSERT INTO t 
      SELECT XPATH('//foo/id/text()',j.entry),j.entry FROM j;

      TRUNCATE TABLE tmp;"

done

psql testdb -c "DROP TABLE tmp;"
以下是您的数据:

testdb=# SELECT * FROM t;
 id  |          entry           
-----+--------------------------
 {1} | <foo>                   +
     |         <id j="a">1</id>+
     |         <val>bar1</val> +
     |     </foo>
 {8} | <foo>                   +
     |         <id j="b">8</id>+
     |         <val>bar1</val> +
     |     </foo>
 {5} | <foo>                   +
     |         <id j="c">5</id>+
     |         <val>bar1</val> +
     |     </foo>
 {2} | <foo>                   +
     |         <id j="b">2</id>+
     |     </foo>
(4 Zeilen)
testdb=#从t中选择*;
id |输入
-----+--------------------------
{1} |                    +
|         1+
|bar1+
|     
{8} |                    +
|         8+
|bar1+
|     
{5} |                    +
|         5+
|bar1+
|     
{2} |                    +
|         2+
|     
(4泽伦)

你好。这个xml文件有多大?巧合的是,我现在正在将一个120GB的xml文件导入到我的数据库中,但我正在使用另一种基于拆分xml文件的方法,将它们导入到临时表中,并将它们取消到目标表中。不确定这是不是你想要的。@JimJones哇!相比之下,我的文件只有区区725MB。我想,在我的情况下,我可以通过拆分文件来逃脱。我以前已经将csv和文本数据导入到数据库中,但列数要少得多。如果我能够弄清楚如何将这个xml模式导入到表中,那么就胜利了一半。
testdb=# SELECT * FROM t;
 id  |          entry           
-----+--------------------------
 {1} | <foo>                   +
     |         <id j="a">1</id>+
     |         <val>bar1</val> +
     |     </foo>
 {8} | <foo>                   +
     |         <id j="b">8</id>+
     |         <val>bar1</val> +
     |     </foo>
 {5} | <foo>                   +
     |         <id j="c">5</id>+
     |         <val>bar1</val> +
     |     </foo>
 {2} | <foo>                   +
     |         <id j="b">2</id>+
     |     </foo>
(4 Zeilen)