Java:如何解析Oracle DB表中的XML类型列数据?
我正在尝试接收Oracle数据类型为XMLType的列 我搜索了一些资源,它们都让我从Oracle获得了以下JAR: ojdbc8.jar xdb6.jar 最后, xmlparserv2.jarJava:如何解析Oracle DB表中的XML类型列数据?,java,oracle,jdbc,xml-parsing,ojdbc,Java,Oracle,Jdbc,Xml Parsing,Ojdbc,我正在尝试接收Oracle数据类型为XMLType的列 我搜索了一些资源,它们都让我从Oracle获得了以下JAR: ojdbc8.jar xdb6.jar 最后, xmlparserv2.jar OraclePreparedStatement stmt = (OraclePreparedStatement) connection.prepareStatement(sql); ResultSet rs = stmt.executeQuery();
OraclePreparedStatement stmt = (OraclePreparedStatement) connection.prepareStatement(sql);
ResultSet rs = stmt.executeQuery();
while (rs.next()) {
XMLType poxml = (XMLType)rs.getObject("XML_DATA");//breaks here
String poString = poxml.getStringVal();
}
首先,它声明getStringval()已被弃用。更令人担忧的是,当我最终获得xmlparserv2.jar时,会出现以下错误,阻止应用程序启动:
org.xml.sax.SAXNotRecognizedException: SAX feature 'http://apache.org/xml/features/allow-java-encodings' not recognized.
oracle.xml.jaxp.JXSAXParserFactory.setFeature(JXSAXParserFactory.java:260)
肯定有办法让这些Java和Oracle DB协同工作吗?它们都属于同一家公司。有多种方法可以从oracle db获取XMLType数据-
- 在PreparedStatement中使用get不透明()调用来获取整个XMLType实例,并使用XMLType构造函数从中构造一个oracle.xdb.XMLType类。然后可以使用XMLType类上的Java函数访问数据
- 在SQL中使用getClobVal()、getStringVal()或getBlobVal(csid),并在java中以oracle.SQL.CLOB、java.lang.String或oracle.SQL.BLOB的形式获取结果
OraclePreparedStatement stmt = (OraclePreparedStatement)
conn.prepareStatement("select e.poDoc from po_xml_tab e");
ResultSet rset = stmt.executeQuery();
OracleResultSet rs = (OracleResultSet) rset;
while(rs.next())
{
XMLType poxml = XMLType.createXML(rs.getOPAQUE("column_name"));
Document podoc = (Document)poxml.getDOM();
//convert document object to string
String xmlString =getStringFromDocument(podoc)
}
-----------------------------------------------------------------------------
//method to get String from Document
private String getStringFromDocument(Document doc)
{
try
{
DOMSource domSource = new DOMSource(doc);
StringWriter writer = new StringWriter();
StreamResult result = new StreamResult(writer);
TransformerFactory tf = TransformerFactory.newInstance();
Transformer transformer = tf.newTransformer();
transformer.transform(domSource, result);
return writer.toString();
}
catch(TransformerException ex)
{
ex.printStackTrace();
return null;
}
我了解了如何从结果集中提取XML和XML类型: 首先,我从Oracle获得了以下JAR: ojdbc8.jar xdb6.jar xmlparserv2.jar-这个jar我必须做一些挖掘才能找到这个jar(不幸的是,我手头没有这个源代码。我记得我必须得到一个.zip文件,它埋在几个文件夹中) 我在Intellij的项目目录中创建了一个lib文件夹(与src文件夹处于同一级别) 。我手动将它们添加到Maven中,并执行以下操作:
<dependency>
<groupId>com.oracle</groupId>
<artifactId>xdb</artifactId>
<version>6</version>
<scope>system</scope>
<systemPath>${project.basedir}/lib/xdb6.jar</systemPath>
</dependency>
<dependency>
<groupId>com.oracle</groupId>
<artifactId>ojdbc</artifactId>
<version>8</version>
<scope>system</scope>
<systemPath>${project.basedir}/lib/ojdbc8.jar</systemPath>
</dependency>
<dependency>
<groupId>com.oracle</groupId>
<artifactId>xmlparserv</artifactId>
<version>2</version>
<scope>system</scope>
<systemPath>${project.basedir}/lib/xmlparserv2.jar</systemPath>
</dependency>
我将其转换为一个字符串,因为稍后我会将XML反序列化为一个对象
ResultSet rs = stmt.executeQuery();
while (rs.next()) {
XMLType poxml = (XMLType) rs.getObject("XML_DATA");
String sDMPayload = poxml == null ? null : poxml.getStringVal();
}