Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/367.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java:如何解析Oracle DB表中的XML类型列数据?_Java_Oracle_Jdbc_Xml Parsing_Ojdbc - Fatal编程技术网

Java:如何解析Oracle DB表中的XML类型列数据?

Java:如何解析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();

我正在尝试接收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中使用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();
        }