2010-04-10 62 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);