在Java中解析XML文件以获取名称列表

在Java中解析XML文件以获取名称列表,java,android,xml,xml-parsing,Java,Android,Xml,Xml Parsing,我目前正在开发一个Android应用程序,这意味着学习Java。我已经玩弄Python好几年了,但我决定现在是时候升级了,因为我有一部android手机。该应用程序基本上显示本地存储在XML文件中的视频游戏列表。现在,XML文件的结构基本上是games>game(Multiple)>name(加上其他现在不重要的东西)。我目前正在尝试获得一份游戏名称的列表。我查阅了一些教程和信息,但似乎都不是我所需要的。我想真正了解它是如何工作的,而不仅仅是有一段可以复制/粘贴的代码。另外,请记住,名称列表必须

我目前正在开发一个Android应用程序,这意味着学习Java。我已经玩弄Python好几年了,但我决定现在是时候升级了,因为我有一部android手机。该应用程序基本上显示本地存储在XML文件中的视频游戏列表。现在,XML文件的结构基本上是games>game(Multiple)>name(加上其他现在不重要的东西)。我目前正在尝试获得一份游戏名称的列表。我查阅了一些教程和信息,但似乎都不是我所需要的。我想真正了解它是如何工作的,而不仅仅是有一段可以复制/粘贴的代码。另外,请记住,名称列表必须以字符串数组结束,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;
     }
公共静态字符串[]解析(字符串文件名){
ArrayList gamesList=新建ArrayList();
试一试{
文件=新文件(文件名);
DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();
DocumentBuilder db=dbf.newDocumentBuilder();
文档doc=db.parse(文件);
doc.getDocumentElement().normalize();
NodeList NodeList=doc.getElementsByTagName(“游戏”);
对于(int s=0;s
在代码中,将fstNmElmnt.toString()添加到gameList时,它是与游戏标记相对应的元素。假设XML是结构化的,则需要获取第一个子元素的值(而不是为元素本身调用toString()):

顺便说一下,除非您在文档的其他部分中有标记,或者在此阶段需要元素进行其他处理,否则您可以使用以下(更简单)代码:

NodeList NodeList=doc.getElementsByTagName(“名称”);
对于(int s=0;s
尝试使用:)

提供了使用Simple的见解

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

这可能毫无意义。让我向你们展示一下……好吧……我刚刚离开,实现了我的想法,下面是结果(完整的代码链接):

主文件:

包com.massaiolir.simple.iface

导入java.io.File

导入org.simpleframework.xml.Serializer; 导入org.simpleframework.xml.core.Persister

公共班机{ 公共静态void main(字符串[]args)引发异常{ Serializer serial=新的Persister(); ResC ResC=serial.read(ResC.class,新文件(“data/testdata.xml”)

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

BaseObject.java类:

包com.massaiolir.simple.iface

导入org.simpleframework.xml.Element

公共类BaseObject实现错误{ @元素(name=“Err”,required=false,type=ConcreteError.class) 私人错误

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

@Override
public void setErrorText(String errorText) {
    err.setErrorText(errorText);
}
} 这是一个类,如果它想要“Err”,所有东西都应该扩展它

错误界面:

包com.massaiolir.simple.iface

公共接口错误{ void setErrorText(字符串errorText)

} ConcreteError类:

包com.massaiolir.simple.iface

导入org.simpleframework.xml.Attribute

公共类ConcreteError实现错误{ @属性 私有字符串文本

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

@Override
public void setErrorText(String errorText) {
    this.text = errorText;
}
} 实际的实现类就在这一点之后,您将看到它们非常简单,因为实际的工作是在上面的类中处理的

Con类:

包com.massaiolir.simple.iface

公共类Con扩展了BaseObject{

} ConList类:

包com.massaiolir.simple.iface

导入java.util.ArrayList

导入org.simpleframework.xml.ElementList

公共类ConList扩展了BaseObject{ @元素列表(entry=“Con”,inline=true) 公审犯; } ConRes类:

包com.massaiolir.simple.iface

导入org.simpleframework.xml.Element

公共类ConRes扩展了BaseObject{ @元素(name=“ConList”) 公共控制列表; } ResC类:

包com.massaiolir.simple.iface

导入org.simpleframework.xml.Element; 导入org.simpleframework.xml.Root

@根 公共类ResC扩展了BaseObject{ @元素(name=“ConRes”) 公共利益; } 这就是问题的全部。非常简单,对吧。我能在十分钟内完成这一切。实际上,我写这个回复所花的时间比我写给你的代码所花的时间要长。如果你对我刚写的代码一无所知,请让我知道。我希望这有助于你理解
    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. == ");
}
@Override
public String getErrorText() {
    return err.getErrorText();
}

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

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