我在访问 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
内的循环都会获得新值,所以我将它们设为局部变量。此外,我将它们的名称更改为category
和name
以反射(reflect)它们与 XML 文档中元素的关联。 - 永远不需要使用
new String()
创建新的 String 对象。一个简单的""
就足够了(参见category
和name
变量的初始化)。 - 循环不再遍历所有内容(通过
"*"
),而是遍历element
元素。然后有一个内部循环迭代每个元素的子元素,即:它的category_id
和name
元素。 - 在内部的每一遍中,我们根据手头节点的名称设置
category
或name
变量。 - 设置给这些变量的实际值是通过
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/