2010-04-10 69 views
2

我在訪問XML文檔的內容時遇到問題。 我的目標是這樣的: 獲取一個XML源並將其解析爲關聯數組的一個公平等價物,然後將其存儲爲一個可持久對象。如何在Blackberry Java應用程序中遍歷和存儲XML?

的XML是非常簡單的:下面

<root> 
<element> 
    <category_id>1</category_id> 
    <name>Cars</name> 
</element> 
<element> 
    <category_id>2</category_id> 
    <name>Boats</name> 
</element> 
</root> 

基本的Java類。我幾乎在上面的http響應後調用save(xml)。是的,XML格式正確。

import java.io.IOException; 
    import java.util.Hashtable; 

    import org.w3c.dom.Document; 
    import org.w3c.dom.Node; 
    import org.w3c.dom.NodeList; 

    import java.util.Vector; 
    import net.rim.device.api.system.PersistentObject; 
    import net.rim.device.api.system.PersistentStore; 
    import net.rim.device.api.xml.parsers.DocumentBuilder; 
    import net.rim.device.api.xml.parsers.DocumentBuilderFactory; 

public class database{ 
     private static PersistentObject storeVenue; 
     static final long key = 0x2ba5f8081f7ef332L; 
     public Hashtable hashtable; 
     public Vector venue_list; 
     String _node,_element; 

    public database() 
    { 
     storeVenue = PersistentStore.getPersistentObject(key); 
    } 

    public void save(Document xml) 
    { 
      venue_list = new Vector(); 
     storeVenue.setContents(venue_list); 


     Hashtable categories = new Hashtable(); 


     try{ 

      DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory. newInstance(); 
      DocumentBuilder docBuilder = docBuilderFactory.newDocumentBuilder(); 
      docBuilder.isValidating(); 

      xml.getDocumentElement().normalize(); 

      NodeList list=xml.getElementsByTagName("*"); 
      _node=new String(); 
      _element = new String(); 

      for (int i=0;i<list.getLength();i++){ 

       Node value=list.item(i).getChildNodes().item(0); 
       _node=list.item(i).getNodeName(); 
       _element=value.getNodeValue(); 

       categories.put(_element, _node); 
      } 

     } 
     catch (Exception e){ 
      System.out.println(e.toString()); 
     } 

     venue_list.addElement(categories); 


     storeVenue.commit(); 
    } 

上面的代碼是正在進行的工作,很可能是嚴重缺陷。但是,我現在已經呆了好幾天了。我永遠不會得到所有的子節點,或名稱/值對。 當我將矢量打印出來作爲字符串時,我通常會得到如下結果: [{= root,= element}] 就是這樣。否 「CATEGORY_ID」,無 「名」

理想情況下,我最終會與像 [{1 =車,2 =船}]

任何幫助表示讚賞。

謝謝

回答

1

下面是您的程序的固定版本。我做的更改如下:

  • 我從save()方法中刪除了DocBuilder-stuff。這些調用需要構造一個新的Document。一旦你有這樣一個對象(並且因爲它是作爲參數傳入的),你不需要DocumentBuilder了。在下面的main方法中說明了DocumentBuilder的正確使用。
  • _node,_element不必是字段。他們每次通過save內的循環都會獲得新值,所以我將它們作爲局部變量。另外,我將它們的名稱更改爲categoryname以反映它們與XML文檔中元素的關聯。
  • 從不需要使用new String()來創建新的String對象。一個簡單的""就夠了(參見categoryname變量的初始化)。
  • 循環現在遍歷element元素,而不是遍歷所有內容(通過"*")。然後有一個內部循環遍歷每個元素的子元素,即:它的category_idname元素。
  • 在內部的每個過程中,我們根據當前節點的名稱設置categoryname變量。
  • 設置爲這些變量的實際值由via node.getTextContent()獲取,該值返回節點的封閉標籤之間的內容。

database

public class database { 
    private static PersistentObject storeVenue; 
    static final long key = 0x2ba5f8081f7ef332L; 
    public Hashtable hashtable; 
    public Vector venue_list; 

    public database() { 
     storeVenue = PersistentStore.getPersistentObject(key); 
    } 

    public void save(Document xml) { 
     venue_list = new Vector(); 
     storeVenue.setContents(venue_list); 

     Hashtable categories = new Hashtable(); 

     try { 

      xml.getDocumentElement().normalize(); 

      NodeList list = xml.getElementsByTagName("element"); 

      for (int i = 0; i < list.getLength(); i++) { 

       String category = ""; 
       String name = ""; 
       NodeList children = list.item(i).getChildNodes(); 
       for(int j = 0; j < children.getLength(); ++j) 
       { 
       Node n = children.item(j); 
       if("category_id".equals(n.getNodeName())) 
        category = n.getTextContent(); 
       else if("name".equals(n.getNodeName())) 
        name = n.getTextContent(); 
       } 

       categories.put(category, name); 

       System.out.println("category=" + category + "; name=" + name); 
      } 

     } catch (Exception e) { 
      System.out.println(e.toString()); 
     } 

     venue_list.addElement(categories); 

     storeVenue.commit(); 
    } 
    } 

這裏有一個主要的方法:

public static void main(String[] args) throws Exception { 
    DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory 
     .newInstance(); 
    DocumentBuilder docBuilder = docBuilderFactory.newDocumentBuilder(); 
    docBuilder.isValidating(); 

    Document xml = docBuilder.parse(new File("input.xml")); 

    database db = new database(); 
    db.save(xml); 
    } 
0

太謝謝你了。只需稍作修改,我就能夠完成我正在尋找的任務。

下面是我不得不做的修改: 即使我在1.5中構建,getTextContent不可用。我不得不使用category = n.getFirstChild()。getNodeValue();來獲取每個節點的值。雖然可能有更新我的構建設置的簡單解決方案,但我不太瞭解BB需求,以瞭解何時可以安全地偏離默認的推薦構建設置。

在主,我不得不改變這一行:

Document xml = docBuilder.parse(new File("input.xml")); 

,以便它是從我的Web服務器提供一個InputStream讀書,而不一定是本地文件 - 儘管我不知道如果存儲xml local比存儲一個完整散列表的向量更有效率。 ...

InputStream responseData = connection.openInputStream(); 
Document xmlParsed = docBuilder.parse(result); 

顯然我跳過用於保持該可讀起見,HTTP連接部分。

您的幫助爲我節省了一個完整的盲目調試周末。非常感謝你!希望這篇文章能夠幫助別人。

0
//res/xml/input.xml 
private static String _xmlFileName = "/xml/input.xml"; 

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 
DocumentBuilder builder = factory.newDocumentBuilder(); 
InputStream inputStream = getClass().getResourceAsStream(_xmlFileName); 
Document document = builder.parse(inputStream);