如何在Java中的PostgreSQL中插入XML文档?

时间:2012-08-21 08:31:42

标签: java xml postgresql jdbc

我在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();

并获得exeption

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"

4 个答案:

答案 0 :(得分:6)

我不确定,但试试这个:

首先将XML转换为Java String。 然后创建一个insert语句并使用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>'));

答案 1 :(得分:3)

如果您没有使用libxml支持构建的Postgres,则更新accepted answer

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 ==&gt; XML。否则,您需要特殊支持XMLPARSE

From Postgres Documentation

  

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

答案 2 :(得分:3)

您可以使用JDBC 4 SQLXML来代替使用PostgreSQL专有语法重写insert语句:

String xml = xml_gkuzu.toString();

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

答案 3 :(得分:2)

虽然postgres具有本地XML Data type,但是从java端开始,你可以处理普通字符串 您可以将xml文档转换为String并插入,它应该可以工作。

<强>更新

查看错误后,您需要通过驱动程序URL将其他变量传递给服务器。

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

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