【问题标题】:How can I insert an XML document in PostgreSQL in Java?如何在 Java 中的 PostgreSQL 中插入 XML 文档?
【发布时间】:2016-03-17 04:20:59
【问题描述】:

我在 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"

【问题讨论】:

标签: java xml postgresql jdbc


【解决方案1】:

我不确定,但试试这个:

首先将您的 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()+")"); 这个结构给出了相同的例外。
  • 如果您使用“stmt.setString()”,您的第二个参数将作为 varchar 值插入。您的语句看起来像这样:“INSERT INTO xml_docs(id, gkuzu) VALUES (1, 'XMLPARSE()'”。但它必须是:“INSERT INTO xml_docs(id, gkuzu) VALUES ( 1、XMLPARSE('')"。(引号)
  • 现在我在你的例子中做了类似的事情,但得到了例外。请看 UPADATE 2。
  • 在您尝试更新代码后,我得到了例外Exception in thread "main" org.postgresql.util.PSQLException: ERROR: syntax error at or near "$3"
  • 为了澄清 Adam Gent 的评论,从字符数据生成 xml 类型值的标准方法是使用函数 XMLPARSE ( { DOCUMENT | CONTENT } value)。 Postgres 添加了自己的 Postgre 特定语法:xml '&lt;foo&gt;bar&lt;/foo&gt;''&lt;foo&gt;bar&lt;/foo&gt;'::xmlSee doc.
【解决方案2】:

您可以使用JDBC 4 SQLXML,而不是使用 PostgreSQL 专有语法重写插入语句:

String xml = xml_gkuzu.toString();

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

【讨论】:

    【解决方案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 ==> XML。否则您将需要对XMLPARSE 的特殊支持

    From Postgres Documentation:

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

    【讨论】:

      【解决方案4】:

      虽然 postgres 有原生 XML Data type,但从 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文档?
      • File file = new File("c:\\yourfile.xml"); DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder db = dbf.newDocumentBuilder(); Document doc = db.parse(file);
      • 您可以在google上搜索如何转换file -&gt; xml documentfile -&gt; inputstream -&gt; string以获得更多帮助。
      猜你喜欢
      • 1970-01-01
      • 2011-02-08
      • 2021-09-18
      • 2020-12-24
      • 1970-01-01
      • 1970-01-01
      • 2011-03-03
      • 1970-01-01
      • 2013-02-22
      相关资源
      最近更新 更多