我将Oracle DB中的XMLType文件加载到Java应用程序中。我准备了一个类来处理XML文件的操作,如下所示:
public class XMLDoc {
private OraclePreparedStatement stmt;
private ResultSet rset;
private OracleResultSet orset;
private Document xml_column;
private XMLType poxml;
public XMLDoc(Connection con, String Query) throws Exception {
setStmt((OraclePreparedStatement)
con.prepareStatement(Query));
setRset(getStmt().executeQuery());
setOrset((OracleResultSet) rset);
}}
在主程序中,我连接到数据库并将XML文件读入xml_column:
Connection con = DriverManager.getConnection(host, username, password);
tables[5] = (new XMLDoc(con, "SELECT p.PENALITESXML FROM PENALITES p WHERE id_order='"+data.getIdOrder()+"'"));
while(tables[5].getOrset().next()) {
tables[5].setPoxml(XMLType.createXML(tables[5].getOrset().getOPAQUE("PENALITESXML")));
tables[5].setXml_column((Document)tables[5].getPoxml().getDocument());
Element element = tables[5].getXml_column().getDocumentElement();}
现在,我想修改加载的XML文档,所以我执行:
tables[5].getXml_column().getElementsByTagName("ISPAID").item(0).getChildNodes().item(0).setNodeValue("Y");
但该文件尚未更新。我做错了什么?
这就是XML文件的样子:
<PENALITES ID_ORDER="50000">
<PENALTY_AMOUNT>100</PENALTY_AMOUNT>
<ISPAID>N</ISPAID>
</PENALITIES>
答案 0 :(得分:0)
您可以在发送给Oracle的SQL中非常简单地完成所有替换:
Connection con = DriverManager.getConnection(host, username, password);
tables[5] = new XMLDoc(
con,
"SELECT UPDATEXML( XMLType( PENALITESXML ), '/PENALTIES/ISPAID/text()', 'Y' ).getStringVal()"
+ " AS PENALTIESXML"
+ " FROM PENALITES"
+ " WHERE id_order='"+data.getIdOrder()+"'"
);
您还应该考虑在预准备语句中使用绑定变量。
答案 1 :(得分:0)
我找到了解决方案。
必须使用方法setTextContent()
代替setNodeValue()
tables[5].getXml_column().getElementsByTagName("ISPAID").item(0).getChildNodes().item(0).setTextContent("Y");
答案 2 :(得分:0)
updateXML已被弃用。您应该尝试使用XQUERY-UPDATE工具和XMLQUERY运算符