繁体   English   中英

Java:如何从Oracle DB表解析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类。 然后,您可以使用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类型:

首先,我从Oracle获得了以下JAR:

ojdbc8.jar

xdb6.jar

xmlparserv2.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>

我通过转到Project Structure-> Artifacts将罐子手动添加到Artifact中(不知道是否有其他方法来进行此操作?),然后将它们添加到我的war文件中(右键单击并说“添加到/ WEB-INF”)

从那里,代码可能看起来像这样:

        ResultSet rs = stmt.executeQuery();
        while (rs.next()) {
            XMLType poxml = (XMLType) rs.getObject("XML_DATA");
            String sDMPayload = poxml == null ? null : poxml.getStringVal();
        }

我将其转换为字符串,因为稍后我会将XML反序列化为对象

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM