我该如何在Java中将XML文档插入PostgreSQL数据库?

9

我在Postgresql中有一张表

DROP TABLE xml_docs;
CREATE TABLE xml_docs(
id serial PRIMARY KEY,
cad_number character(50),
gkuzu_name character(50),
gkuzu xml,
rreq_name character(50),
rreq xml
)

我使用JDBC进行数据库连接。我想将整个XML文档插入到表中。
我该如何实现这个功能?

更新

好的,我尝试一下。

  String sql = "INSERT INTO xml_docs(cad_number,gkuzu_name,gkuzu,rreq_name,rreq) VALUES(?,?,?,?,?)";
  PreparedStatement stmt = ce.prepareStatement(sql);
  stmt.setString(1, "11:33:5464563");
  stmt.setString(2, xml_gkuzu.getName());
  stmt.setString(3, xml_gkuzu.toString());
  stmt.setString(4, xml_rreq.getName());
  stmt.setString(5, xml_rreq.toString());
  stmt.executeQuery();
ce.close();
  se.close();

并获取异常

Exception in thread "main" org.postgresql.util.PSQLException: ERROR: column "gkuzu" is of type xml but expression is of type character varying
Подсказка: You will need to rewrite or cast the expression.

有什么问题吗?

更新2

当我尝试这样做时

 String sql1 = "INSERT INTO xml_docs(cad_number,gkuzu_name,gkuzu,rreq_name,rreq) VALUES(11335464563,"+xml_gkuzu.getName()+",XMLPARSE("+xml_gkuzu.toString()+"),"+xml_rreq.getName()+",XMLPARSE("+xml_rreq.toString()+"))";

我遇到了异常错误

Exception in thread "main" org.postgresql.util.PSQLException: ERROR: syntax error at or near "bf48e000b0"

有用的链接: https://dev59.com/Zk7Sa4cB1Zd3GeqP4IEp - Lucas Noetzold
4个回答

8

我不是很确定,但建议尝试以下方法:

首先将XML转换为Java字符串,然后创建一个插入语句并使用PostgreSQL的XMLPARSE方法将您的值转换为PostgreSQL的xml类型:

INSERT INTO xml_docs(id, gkuzu) VALUES (1, XMLPARSE('<foo><bar>Hello</bar></foo>'));

请参考: http://wiki.postgresql.org/wiki/XML_Support 更新: Java 代码示例:
String sql = "INSERT INTO xml_docs(id, gkuzu) VALUES (?, XMLPARSE(?))";
[...]
stmt.setString(2, "<foo>Hello World!</foo>");

这应该创建以下语句:
INSERT INTO xml_docs(id, gkuzu) VALUES (1, XMLPARSE('<foo>Hello World!</foo>'));

stmt.setString(3, "XMLPARSE("+xml_gkuzu.toString()+")"); 这个语句会产生相同的异常。 - Kliver Max
如果您使用 "stmt.setString()",则第二个参数将被插入为 varchar 值。此时,您的语句看起来像这样:"INSERT INTO xml_docs(id, gkuzu) VALUES (1, 'XMLPARSE(<foo></foo>)'"。但实际上它应该是这样的:"INSERT INTO xml_docs(id, gkuzu) VALUES (1, XMLPARSE('<foo></foo>'))"。(要加引号) - user1606528
1
尝试使用您的更新代码后,我得到了异常Exception in thread "main" org.postgresql.util.PSQLException: ERROR: syntax error at or near "$3" - Kliver Max
从版本9.0开始,XMLPARSE更名为XML - Adam Gent
1
澄清Adam Gent的评论,从字符数据生成xml类型值的标准方法是使用函数 XMLPARSE({DOCUMENT | CONTENT} value)。Postgres添加了自己的Postgre特定语法:xml '<foo>bar</foo>''<foo>bar</foo>'::xml。[参见文档] (http://www.postgresql.org/docs/current/static/datatype-xml.html)。 - Basil Bourque
显示剩余4条评论

7

不需要使用PostgreSQL专有语法重写插入语句,你可以使用JDBC 4 SQLXML

String xml = xml_gkuzu.toString();

SQLXML sqlxml = connection.createSQLXML();
sqlxml.setString(xml);
stmt.setSQLXML(3, sqlxml);

在我看来,这绝对是最好的答案。 - BigMac66

3
如果您的Postgres没有构建libxml支持,则需要对已接受答案进行更新:
Java代码示例:
String sql = "INSERT INTO xml_docs(id, gkuzu) VALUES (?, XML(?))";
[...]
stmt.setString(2, "<foo>Hello World!</foo>");

这应该创建此语句:

INSERT INTO xml_docs(id, gkuzu) VALUES (1, XML('<foo>Hello World!</foo>'));

因此,对于版本9.0及更高版本,您可能希望将XMLPARSE切换为XML。否则,您将需要特殊支持XMLPARSE从Postgres文档
引用:

用于转换为和从类型xml的类似函数表达式xmlparse和xmlserialize在此处不再重复。使用大多数这些函数需要安装时使用configure --with-libxml进行构建。


3

虽然PostgreSQL原生支持XML数据类型,但在Java端可以使用普通字符串进行处理。
您可以将xml文档转换为字符串并插入数据库,这样应该可以正常工作。

更新:

在查看您的错误后,您需要通过驱动程序URL传递一个额外的变量给服务器。

jdbc:postgresql://localhost/test?stringtype=unspecified
or
jdbc:postgresql://localhost/test?user=user&password=pass&stringtype=unspecified

额外的参数stringtype=unspecified将移除输入字符串的类型检查。

也许我做错了什么,但是 System.out.println(xml_rreq.toString()); 给出的是文件名。如何从文件中获取 XML 文档? - Kliver Max
File file = new File("c:\\yourfile.xml"); DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder db = dbf.newDocumentBuilder(); Document doc = db.parse(file); - RP-
你可以在谷歌上搜索如何将 file -> xml documentfile -> inputstream -> string 进行转换以获取更多帮助。 - RP-
1
非常感谢,你的解决方案是唯一帮助我的。如果我第一次访问这个页面时就阅读了这个答案,它会为我节省数小时的时间。 - noriks

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接