簡體   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