在Java中解析XML文件以获取名称列表
我目前正在开发一个Android应用程序,这意味着学习Java。我已经玩弄Python好几年了,但我决定现在是时候升级了,因为我有一部android手机。该应用程序基本上显示本地存储在XML文件中的视频游戏列表。现在,XML文件的结构基本上是games>game(Multiple)>name(加上其他现在不重要的东西)。我目前正在尝试获得一份游戏名称的列表。我查阅了一些教程和信息,但似乎都不是我所需要的。我想真正了解它是如何工作的,而不仅仅是有一段可以复制/粘贴的代码。另外,请记住,名称列表必须以字符串数组结束,Android才能使用它。这是我现在拥有的函数(从教程中复制/粘贴,并经过大量编辑,因此不可读。一旦它实际工作,我将修复它。)现在listview显示为空。至少它比以前好了,而且不再崩溃了在Java中解析XML文件以获取名称列表,java,android,xml,xml-parsing,Java,Android,Xml,Xml Parsing,我目前正在开发一个Android应用程序,这意味着学习Java。我已经玩弄Python好几年了,但我决定现在是时候升级了,因为我有一部android手机。该应用程序基本上显示本地存储在XML文件中的视频游戏列表。现在,XML文件的结构基本上是games>game(Multiple)>name(加上其他现在不重要的东西)。我目前正在尝试获得一份游戏名称的列表。我查阅了一些教程和信息,但似乎都不是我所需要的。我想真正了解它是如何工作的,而不仅仅是有一段可以复制/粘贴的代码。另外,请记住,名称列表必须
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;
}