java - 您如何在 Blackberry Java 应用程序中遍历和存储 XML?

标签 java xml arrays blackberry associative

我在访问 XML 文档的内容时遇到问题。 我的目标是: 获取 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();
    }

上面的代码正在进行中,很可能存在严重缺陷。但是,我已经这样做了好几天了。我似乎永远无法获得所有子节点或名称/值对。 当我将 vector 作为字符串打印出来时,通常会得到如下结果: [{ = 根, = 元素}] 就是这样。没有“category_id”,没有“name”

理想情况下,我最终会得到类似 [{1 = 汽车,2 = 船}]

感谢任何帮助。

谢谢

最佳答案

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

  • 我从 save() 方法中删除了 DocBuilder 内容。需要这些调用来构建新的 Document。一旦你有了这样一个对象(你这样做了,因为它是作为参数传入的),你就不再需要 DocumentBuilder 了。 DocumentBuilder 的正确使用在下面的 main 方法中进行了说明。
  • _node,_element 不必是字段。它们每次通过 save 内的循环都会获得新值,所以我将它们设为局部变量。此外,我将它们的名称更改为 categoryname 以反射(reflect)它们与 XML 文档中元素的关联。
  • 永远不需要使用 new String() 创建新的 String 对象。一个简单的 "" 就足够了(参见 categoryname 变量的初始化)。
  • 循环不再遍历所有内容(通过 "*"),而是遍历 element 元素。然后有一个内部循环迭代每个元素的子元素,即:它的 category_idname 元素。
  • 在内部的每一遍中,我们根据手头节点的名称设置categoryname 变量。
  • 设置给这些变量的实际值是通过 node.getTextContent() 获得的,它返回节点封闭标签之间的内容。

数据库:

  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);
  }

关于java - 您如何在 Blackberry Java 应用程序中遍历和存储 XML?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2611964/

相关文章:

java - 通过 ASM 在字节码中添加 try/catch block 时出现VerifyError

java - 为什么我不能用 fillPolygon() 绘制矩形

java - cvc-elt.1.a : Cannot find the declaration of element 'people'

json - 从xml文档/Powershell/控制数组格式生成JSON

java - 使用 XSLT 删除 PrettyPrint

c++ - 编译错误声明我的 char vector 数组

linux - Bash:如何截断数组?

c# - 字节数组封装数据包

java - 使 MySQL 以英语(而不是波斯语)存储所有数字

java - 是否可以通过编程方式识别 USB 通信模式?