2011-02-04 129 views
4

我目前正在開發Android應用程序,這意味着要學習Java。我已經玩了好幾年Python,但是現在是時候加強,現在我有一個Android手機。該應用程序基本上在本地顯示存儲在XML文件中的視頻遊戲列表。目前,XML文件的結構基本上是遊戲>遊戲(多個)>名稱(加上其他不重要的東西)。我目前正在嘗試獲取遊戲名稱列表。我查了教程和信息,但似乎沒有什麼是我需要的。我想真正理解它是如何工作的,而不僅僅是我可以複製/粘貼一段代碼。另外,請記住,名稱列表最終必須以Android的字符串數組來使用它。這裏是我現在使用的功能(從教程複製/粘貼並進行了大量編輯,因此它不可讀,一旦它實際工作,我會修復它。)現在,listview顯示爲空。至少它比以前更好,它不會崩潰了,但...解析Java中的XML文件以獲取名稱列表

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

如果你不熟悉Java,我不會建議通過嘗試解析XML文件開始。 DOM調用的一般格式看起來不錯。你在用`NodeList nodeList`做什麼?程序是否進入FOR循環? – user183037 2011-02-04 06:12:16

回答

1

在你的代碼,在您添加fstNmElmnt.toString()到遊戲列表的點,它是對應於標籤元素的遊戲。假設你的XML的結構<名稱>喬< /名稱>,那麼你需要得到第一個孩子的價值(而不是調用toString()的元素本身):

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

順便說一句,除非你有<名稱>標籤文檔的其他部分,或需要其他處理<遊戲>元素在這個階段,你可以使用下面的(更簡單)的代碼:

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

Robert Massaioli's answer提供使用簡單的見解。

要記住的重要一點是簡單XML應該能夠遵循任何可以使用類在邏輯上生成的結構。所以你可以創建一個BaseClass,它使用一個錯誤接口並應用Decorator模式,以便它將所有這些傳遞給一個具體的錯誤類,而不需要任何實現對象需要知道它們是什麼。

這可能沒有意義。怎麼樣我只是告訴你......好吧......我只是走了,實現正是我想和這裏的結果(完整的代碼鏈接):

主文件:

包融爲一體。 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.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 class:

package com.massaiolir.simple.iface;

import org.simpleframework.xml.Element;

公共類BaseObject實現錯誤{Ellement(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); 
} 

} 這是類,如果它想「犯錯」一切都應該延長。

該錯誤界面:

包com.massaiolir.simple.iface;

public interface Error {0} {0} {0} {0} setErrorText(String errorText);

String getErrorText(); 

} 的ConcreteError類:

包com.massaiolir.simple.iface;

import org.simpleframework.xml.Attribute;

public class ConcreteError implements 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;

公共類精讀延伸BaseObject {

} 的ConList類:

包com.massaiolir.simple.iface;

import java.util.ArrayList;

import org.simpleframework.xml.ElementList;

public class ConList extends BaseObject {EllementList(entry =「Con」,inline = true) public ArrayList cons; } ConRes等級:

package com.massaiolir.simple.iface;

import org.simpleframework.xml。元件;

公共類ConRes擴展BaseObject {元素(名稱=「ConList」) public ConList conList; } ResC等級:

package com.massaiolir.simple.iface;

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

@Root public class ResC extends BaseObject @Element(name =「ConRes」) public ConRes conRes; } 就是這樣。很簡單的權利。十分鐘之內我就能夠完成所有的工作。實際上,我花了我更長的時間來編寫這個響應,而不是寫下我給你的代碼。如果您對我剛剛編寫的代碼不瞭解,請告訴我。我希望這可以幫助你理解你如何去做這樣的事情。