2010-07-08 62 views
0

嗨我在嘗試將XML文件加載到Java中的屬性對象時遇到問題。這就是我要做的:無法將XML加載到屬性對象中Java

public class loadXML() { 

private dbConn 

public loadXML(Connection currConn) { 
    this.dbConn = currConn; 
} 

public Properties populateProperties() { 
    ResultSet rst; 
    Statement stmt; 
    Connection con; 
    Properties prop; 

    con = dbConn.getConnection(); 
    stmt = conn.createStatement(); 
    rst.executeQuery("SELECT xml_row FROM xml_table"); 

    if (rst.next()) { 
      prop = new Properties(); 
      /* Old Code */ 
      System.out.println(((XMLType)rst.getObject("xml_row")).getStringVal()); // * Note 1 
      prop.loadFromXML(((XMLType)rst.getObject("xml_row")).getInputStream()); 
      /* Old Code */ 

      /* New Code */ 

      // transform xml loaded from database into byte stream. 
      byte[] bytes = ((XMLType)rst.getObject("xml_row")).getDOM().toString().getBytes("UTF-8"); 
      // Load stream into properties object 
      prop.loadFromXML(new ByteArrayInputStream(bytes)); 

      /* New Code */ 
    } 

    return prop; 
} 

} 

下面是因爲它被保存在數據庫中的XML摘錄:

<?xml version="1.0" encoding="UTF-8" standalone="no"?> 
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd"> 
<properties> 
    <entry key="key-name"></entry> 
    <entry key="key-name">123456</entry> 
</properties> 

注1 - 這是什麼的System.out.println()在屏幕上顯示:

XML提取

<?xml version="1.0" encoding="UTF-8" standalone='no'?> 
<!DOCTYPE properties> 
<!--Copyright 2006 Sun Microsystems, Inc. All rights reserved.--> 
<!-- DTD for properties --> 
<properties version="1.0"> 
    <entry key="key-name"></entry> 
    <entry key="key-name">123456</entry> 
</properties> 

在哪裏我注意到,版本屬性添加到的Elemen牛逼屬性(但並沒有真正困擾我),但問題是,鏈接到DTD被刪除(即SYSTEM「http://java.sun.com/dtd/properties.dtd」),這是執行下面的代碼行的時候觸發一個錯誤:

prop.loadFromXML(((XMLType)rst.getObject("xml_row")).getInputStream()); 

以下是錯誤:

java.util.InvalidPropertiesFormatException:org.xml.sax.SAXParseException :: XML-20149:(錯誤)使用但未聲明元素'屬性'。

+0

我設法找到了這個問題。 Java代碼中沒有錯。我正在使用Oracle 10g數據庫,xml_table中的xml_row被聲明爲XML類型。從數據庫中檢索時,Oracle 10g自動嘗試驗證存儲在xml_row中的XML數據是否與DTD相對。在我的情況下,數據庫服務器安裝在沒有訪問互聯網的機器上,這引發了錯誤。我所做的是將行類型更改爲CLOB。 – 2010-09-10 13:16:56

回答

0

對我來說,它看起來像DTD已被添加至少部分。這兩條註釋行來自系統URL中的原始DTD文件。但元素和屬性聲明丟失。也許從數據庫驅動程序的ResultSet :: getObject實現是..說..沒有完全測試。