我目前正在开发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;
}
答案 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; } 这就是它的全部内容。非常简单吧。我能够在十分钟内全力以赴。写这个回复实际上花了我更长的时间,而不是我编写我给你的代码。如果您对我刚刚编写的代码一无所知,请告诉我。我希望这有助于你了解如何做这样的事情。