2011-02-04 74 views
4

我目前正在开发Android应用程序,这意味着要学习Java。我已经玩了好几年Python,但是现在是时候加强,现在我有一个Android手机。该应用程序基本上在本地显示存储在XML文件中的视频游戏列表。目前,XML文件的结构基本上是游戏>游戏(多个)>名称(加上其他不重要的东西)。我目前正在尝试获取游戏名称列表。我查了教程和信息,但似乎没有什么是我需要的。我想真正理解它是如何工作的,而不仅仅是我可以复制/粘贴一段代码。另外,请记住,名称列表最终必须以Android的字符串数组来使用它。这里是我现在使用的功能(从教程复制/粘贴并进行了大量编辑,因此它不可读,一旦它实际工作,我会修复它。)现在,listview显示为空。至少它比以前更好,它不会崩溃了,但...解析Java中的XML文件以获取名称列表

public static String[] parse(String filename) { 
     ArrayList<String> gamesList = new ArrayList<String>(); 

     try { 
     File file = new File(filename); 
     DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
     DocumentBuilder db = dbf.newDocumentBuilder(); 
     Document doc = db.parse(file); 
     doc.getDocumentElement().normalize(); 
     NodeList nodeList = doc.getElementsByTagName("game"); 

     for (int s = 0; s < nodeList.getLength(); s++) { 

     Node fstNode = nodeList.item(s); 

     //if (fstNode.getNodeType() == Node.ELEMENT_NODE) { 

      Element name = (Element) fstNode; 
       Element fstElmnt = (Element) fstNode; 
      NodeList fstNmElmntLst = fstElmnt.getElementsByTagName("name"); 
      Element fstNmElmnt = (Element) fstNmElmntLst.item(0); 
      NodeList fstNm = fstNmElmnt.getChildNodes(); 

      gamesList.add(fstNmElmnt.toString()); 
     //} 

     } 
     } catch (Exception e) { 
     e.printStackTrace(); 
     } 
    String[] gamesArray; 
    gamesArray = (String[]) gamesList.toArray(new String[0]); 
    return gamesArray; 
    } 
+2

如果你不熟悉Java,我不会建议通过尝试解析XML文件开始。 DOM调用的一般格式看起来不错。你在用`NodeList nodeList`做什么?程序是否进入FOR循环? – user183037 2011-02-04 06:12:16

回答

1

在你的代码,在您添加fstNmElmnt.toString()到游戏列表的点,它是对应于标签元素的游戏。假设你的XML的结构<名称>乔< /名称>,那么你需要得到第一个孩子的价值(而不是调用toString()的元素本身):

gamesList.add(fstNmElmnt.getFirstChild().getNodeValue()); 

顺便说一句,除非你有<名称>标签文档的其他部分,或需要其他处理<游戏>元素在这个阶段,你可以使用下面的(更简单)的代码:

NodeList nodeList = doc.getElementsByTagName("name"); 
for (int s = 0; s < nodeList.getLength(); ++s) { 
    gamesList.add(nodeList.item(s).getFirstChild().getNodeValue()); 
} 
0

Robert Massaioli's answer提供使用简单的见解。

要记住的重要一点是简单XML应该能够遵循任何可以使用类在逻辑上生成的结构。所以你可以创建一个BaseClass,它使用一个错误接口并应用Decorator模式,以便它将所有这些传递给一个具体的错误类,而不需要任何实现对象需要知道它们是什么。

这可能没有意义。怎么样我只是告诉你......好吧......我只是走了,实现正是我想和这里的结果(完整的代码链接):

主文件:

包融为一体。 massaiolir.simple.iface;

import java.io.File;

import org.simpleframework.xml.Serializer; import org.simpleframework.xml.core.Persister;

public class Main public static void main(String [] args)throws Exception { Serializer serial = new Persister(); (ResC.class,new File(“data/testdata.xml”));

System.out.println(" == Printing out all of the error text. == "); 
    System.out.println(resc.getErrorText()); 
    System.out.println(resc.conRes.getErrorText()); 
    System.out.println(resc.conRes.conList.getErrorText()); 
    for (Con con : resc.conRes.conList.cons) { 
     System.out.println(con.getErrorText()); 
    } 
    System.out.println(" == Finished printing out all of the error text. == "); 
} 

} 它只是运行简单,并显示结果。

BaseObject。java class:

package com.massaiolir.simple.iface;

import org.simpleframework.xml.Element;

公共类BaseObject实现错误{Ellement(name =“Err”,required = false,type = ConcreteError.class) private Error err;

@Override 
public String getErrorText() { 
    return err.getErrorText(); 
} 

@Override 
public void setErrorText(String errorText) { 
    err.setErrorText(errorText); 
} 

} 这是类,如果它想“犯错”一切都应该延长。

该错误界面:

包com.massaiolir.simple.iface;

public interface Error {0} {0} {0} {0} setErrorText(String errorText);

String getErrorText(); 

} 的ConcreteError类:

包com.massaiolir.simple.iface;

import org.simpleframework.xml.Attribute;

public class ConcreteError implements Error { @Attribute private String text;

@Override 
public String getErrorText() { 
    return text; 
} 

@Override 
public void setErrorText(String errorText) { 
    this.text = errorText; 
} 

} 实际的实现类在此之后。你会看到它们很微不足道,因为真正的工作正在上面的课程中处理。

该CoN类:

包com.massaiolir.simple.iface;

公共类精读延伸BaseObject {

} 的ConList类:

包com.massaiolir.simple.iface;

import java.util.ArrayList;

import org.simpleframework.xml.ElementList;

public class ConList extends BaseObject {EllementList(entry =“Con”,inline = true) public ArrayList cons; } ConRes等级:

package com.massaiolir.simple.iface;

import org.simpleframework.xml。元件;

公共类ConRes扩展BaseObject {元素(名称=“ConList”) public ConList conList; } ResC等级:

package com.massaiolir.simple.iface;

import org.simpleframework.xml.Element; import org.simpleframework.xml.Root;

@Root public class ResC extends BaseObject @Element(name =“ConRes”) public ConRes conRes; } 就是这样。很简单的权利。十分钟之内我就能够完成所有的工作。实际上,我花了我更长的时间来编写这个响应,而不是写下我给你的代码。如果您对我刚刚编写的代码不了解,请告诉我。我希望这可以帮助你理解你如何去做这样的事情。