Java:如何解析来自 Oracle DB Table 的 XML 类型列数据?
Java: How do I parse XML Type Column Data from Oracle DB Table?
我正在尝试接收 Oracle 数据类型为 XMLType 的列
我搜索了几个资源,它们都引导我从 Oracle 获得以下 jar:
ojdbc8.jar
xdb6.jar
最后,
xmlparserv2.jar
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 中使用 getOPAQUE() 调用获取整个 XMLType 实例,并使用 XMLType 构造函数从中构造一个 oracle.xdb.XMLType class。然后您可以使用 XMLType class 上的 Java 函数来访问数据。
- 使用 SQL 中的 getClobVal()、getStringVal() 或 getBlobVal(csid) 并在 oracle.sql.CLOB、java.lang.String 或 oracle.sql.BLOB 中获取结果=25=]
请尝试以下代码:
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 类型:
首先,我从 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>
我手动将 jars 添加到 Artifact(如果有不同的方法可以不起诉?)
通过转到 Project Structure -> Artifacts 并将它们添加到我的 war 文件中(右键单击并说 "Add to /WEB-INF")
从那里开始,代码可能如下所示:
ResultSet rs = stmt.executeQuery();
while (rs.next()) {
XMLType poxml = (XMLType) rs.getObject("XML_DATA");
String sDMPayload = poxml == null ? null : poxml.getStringVal();
}
我将其转换为字符串,因为稍后我会将 XML 反序列化为一个对象
我正在尝试接收 Oracle 数据类型为 XMLType 的列
我搜索了几个资源,它们都引导我从 Oracle 获得以下 jar:
ojdbc8.jar xdb6.jar 最后, xmlparserv2.jar
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 中使用 getOPAQUE() 调用获取整个 XMLType 实例,并使用 XMLType 构造函数从中构造一个 oracle.xdb.XMLType class。然后您可以使用 XMLType class 上的 Java 函数来访问数据。
- 使用 SQL 中的 getClobVal()、getStringVal() 或 getBlobVal(csid) 并在 oracle.sql.CLOB、java.lang.String 或 oracle.sql.BLOB 中获取结果=25=]
请尝试以下代码:
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 类型:
首先,我从 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>
我手动将 jars 添加到 Artifact(如果有不同的方法可以不起诉?) 通过转到 Project Structure -> Artifacts 并将它们添加到我的 war 文件中(右键单击并说 "Add to /WEB-INF")
从那里开始,代码可能如下所示:
ResultSet rs = stmt.executeQuery();
while (rs.next()) {
XMLType poxml = (XMLType) rs.getObject("XML_DATA");
String sDMPayload = poxml == null ? null : poxml.getStringVal();
}
我将其转换为字符串,因为稍后我会将 XML 反序列化为一个对象