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 反序列化为一个对象