如何使用java从PostgreSQL数据库中的现有数据库创建新的XML文件

如何使用java从PostgreSQL数据库中的现有数据库创建新的XML文件,java,xml,database,parsing,postgresql,Java,Xml,Database,Parsing,Postgresql,向PostgreSQL数据库中插入XML数据(从网页中获取)的最佳方法是什么? 我正在使用Java,需要一些帮助来找到一种将这些数据读入数据库的好方法。Postgres提供了(感谢Daniel Lyons指出)您可以使用它来存储表。但是,如果您想手动分解XML数据,则可以在数据库中表示XML数据。第一个问题应该是,如果您想要一个非常通用的解决方案,该解决方案将能够存储任何XML文档或特定于您的域的XML文档(即仅允许特定结构的XML文档)。根据这一点,您将有一个非常灵活、通用的表示法,但它很难查

向PostgreSQL数据库中插入XML数据(从网页中获取)的最佳方法是什么?
我正在使用Java,需要一些帮助来找到一种将这些数据读入数据库的好方法。

Postgres提供了(感谢Daniel Lyons指出)您可以使用它来存储表。但是,如果您想手动分解XML数据,则可以在数据库中表示XML数据。第一个问题应该是,如果您想要一个非常通用的解决方案,该解决方案将能够存储任何XML文档或特定于您的域的XML文档(即仅允许特定结构的XML文档)。根据这一点,您将有一个非常灵活、通用的表示法,但它很难查询(所需的SQL将非常复杂)。如果采用更具体的方法,查询将更简单,但每次要存储其他类型的文档或向现有文档添加字段时,都需要创建新表或向现有talbes添加新属性;因此,更改模式将更加困难(这是XML的一个主要优势)。我应该给你一些想法什么是不同的可能性

也可以考虑切换到支持XQuery的数据库。使用XQuery(一种专门处理XML的语言)进行本机查询的能力将大大简化事情

更新:根据您的评论,您的XML数据(即)是完全相关的。它可以1:1映射到下表:

CREATE TABLE mynt (
    ID          SERIAL     ,
    myntnafn    CHAR(3)    ,
    myntheiti   Varchar(255) ,
    kaupgengi   Decimal(15,2) ,
    midgengi    Decimal(15,2) ,
    solugengi   Decimal(15,2) ,
    dagsetning  TimeStamp      
)
因此,任何
mynt
标记都将是表中的一条记录,而相应的子标记则是属性。我从您的数据中收集的数据类型可能是错误的。在我看来,主要的问题是没有自然主键,所以我添加了一个自动生成的主键。

PostgreSQL有一个。有很多方法可用于查询和修改数据,例如使用xpath


从Java方面来说,您可以假装只处理字符串,但要知道数据在输出时格式良好,不允许存储格式不正确的数据。

我有一个可行的实现,我在PostgreSQL中执行所有操作,不需要额外的库

辅助解析函数
创建或替换函数f_xml_extract_val(文本,xml)
将文本返回为
$func$
选择案例
当$1~'@[:alnum:]+$时
(xpath($1,$2))[1]
当$1~*'/text()$时
(xpath($1,$2))[1]
如果$1与“%/”类似,则
(xpath($1 | |'text()',$2))[1]
其他的
(xpath($1 | |’/text()',$2))[1]
结束;
$func$语言sql不可变;
处理多个值 上述实现不会在一个xpath中处理多个属性。这里有一个版本的
f\u xml\u extract\u val()
用于此目的。使用第三个参数,您可以选择
one
(第一个)、
all
dist
(不同的)值。多个值聚合为逗号分隔的字符串

创建或替换函数f_xml_extract_val(_pathtext,_nodexml,_modetext)
将文本返回为
$func$
声明
_xpath文本:=大小写
当$1~~'%/'时,则$1 | |'text()
当低于($1)~'%/text()'时,则为$1
当$1~'@\w+$时,则为$1
ELSE$1 | |'/text()'
结束;
开始
--获取一个、全部或不同的值
个案3元
当“one”返回时(xpath(_xpath,$2))[1]::text;
当'all'时,则将数组_返回到_字符串(xpath(_xpath,$2),',');
当'dist'时,则将数组\u返回到\u字符串(数组(
选择DISTINCT unnest(xpath(_xpath,$2))::文本顺序为1),',');
否则将引发异常

'无效$3:>>%当您说xml数据到数据库时,您的意思是要插入完整的xml(作为字符串/文本)或解析字段并插入每个字段?只需将xml文件添加到数据库中,或解析其中的值并保存到特定表中?这是数据,是的,我有一个表,该数据应该进入其中,那张表的列与每张表的列相同。呃,很抱歉,假设它没有给出问题。@Daniel:我现在更新了它,以反映PostgreSQL有XML这一事实。然而,从我收集的资料来看,DB2仍然具有使用XQuery的优势。我将使用postgres,但我在上面的评论中链接的xml数据是我将使用的唯一一种数据。我需要在表中插入的所有XML都将类似于此XML,因此我永远不会添加新属性或类似的内容。我会在谷歌上搜索更多的东西,并试图找到一些东西,但如果你有任何想法,我可以用它来做这件事,请分享:)。(抱歉,如果我的英语不好,这不是我的强项)。@MaxvonHippel他们今天似乎在工作,但无论如何,我不能编辑四年前评论中的链接,所以你最好只留下正确的链接。如果xml行包含保留字符,如“'”或“&”?,我必须怎么做??