使用Java解析XML文件以获取名称列表

时间:2011-02-04 05:53:13

标签: java android xml xml-parsing

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

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

3 个答案:

答案 0 :(得分:1)

在你的代码中,当你将fstNmElmnt.toString()添加到gameList时,它就是与游戏标签相对应的元素。假设您的XML是结构化的&lt; name&gt; Joe&lt; / name&gt;,那么您需要获取第一个子节点的值(而不是为Element本身调用toString()):

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

顺便说一下,除非你有&lt; name&gt;标签在文档的其他部分,或需要&lt; game&gt;在此阶段进行其他处理的元素,您可以使用以下(更简单的)代码:

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

答案 1 :(得分:0)

尝试使用Simple:)

答案 2 :(得分:0)

Robert Massaioli's answer提供了使用Simple。

的见解

要记住的重要一点是,Simple XML应该能够遵循您可以使用类逻辑生成的任何结构。因此,您可以创建一个使用错误接口的BaseClass并应用Decorator模式,以便将所有这些传递到具体的错误类,而不需要任何实现对象知道它们已经被赋予了什么。

这可能毫无意义。我只是告诉你......好吧......我刚刚离开并完全按照我的想法实现了这里的结果(完整的代码链接):

主文件:

package com.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 resc = serial.read(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类:

package com.massaiolir.simple.iface;

import org.simpleframework.xml.Element;

public class BaseObject实现Error {     @Element(name =“Err”,required = false,type = ConcreteError.class)     私有错误;

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

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

} 如果它想要'Err',这就是一切都应该扩展的类。

错误界面:

package com.massaiolir.simple.iface;

public interface Error {     void setErrorText(String errorText);

String getErrorText();

} ConcreteError类:

package com.massaiolir.simple.iface;

import org.simpleframework.xml.Attribute;

public class ConcreteError实现Error {     @属性     私有字符串文本;

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

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

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

Con类:

package com.massaiolir.simple.iface;

公共类Con扩展BaseObject {

} ConList类:

package com.massaiolir.simple.iface;

import java.util.ArrayList;

import org.simpleframework.xml.ElementList;

public class ConList extends BaseObject {     @ElementList(entry =“Con”,inline = true)     public ArrayList cons; } ConRes类:

package com.massaiolir.simple.iface;

import org.simpleframework.xml.Element;

公共类ConRes扩展BaseObject {     @Element(name =“ConList”)     public ConList conList; } ResC课程:

package com.massaiolir.simple.iface;

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

@root 公共类ResC扩展BaseObject {     @Element(name =“ConRes”)     公共ConRes conRes; } 这就是它的全部内容。非常简单吧。我能够在十分钟内全力以赴。写这个回复实际上花了我更长的时间,而不是我编写我给你的代码。如果您对我刚刚编写的代码一无所知,请告诉我。我希望这有助于你了解如何做这样的事情。