繁体   English   中英

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

[英]Parsing an XML file in Java to get a list of names

我目前正在开发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;
     }

在您的代码中,在向游戏列表添加fstNmElmnt.toString()时,它是与游戏标记对应的元素。 假设您的XML是结构化<name> Joe </ name>,那么您需要获取第一个子节点的值(而不是为Element本身调用toString()):

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

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

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

Robert Massaioli的回答提供了使用Simple的见解。

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

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

主文件:

包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类:

包com.massaiolir.simple.iface;

import org.simpleframework.xml.Element;

public class BaseObject实现Error {@Element(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);
}

如果它想要'Err',这就是所有应该扩展的类。

错误界面:

包com.massaiolir.simple.iface;

public interface Error {void setErrorText(String errorText);

String getErrorText();

ConcreteError类:

包com.massaiolir.simple.iface;

import org.simpleframework.xml.Attribute;

公共类ConcreteError实现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;

公共类Con扩展BaseObject {

ConList类:

包com.massaiolir.simple.iface;

import java.util.ArrayList;

import org.simpleframework.xml.ElementList;

公共类ConList扩展BaseObject {@ElementList(entry =“Con”,inline = true)public ArrayList cons; ConRes类:

包com.massaiolir.simple.iface;

import org.simpleframework.xml.Element;

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

包com.massaiolir.simple.iface;

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

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

尝试使用简单 :)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM