2011-02-04 7 views
4

私は現在Androidアプリを開発中です。これはJavaの学習を意味します。私は数年前からPythonを使いこなしてきましたが、今はアンドロイドの携帯電話を持っていることになりました。このアプリは基本的にXMLファイルにローカルに保存されたビデオゲームのリストを表示します。現在、XMLファイルの構造は、基本的にはゲーム>ゲーム(複数)>名前(これ以外は重要ではありません)です。私は現在、ゲームの名前のリストを取得しようとしています。私はチュートリアルや情報を見てきましたが、私の必要とするものはそれほど多くありません。実際にどのように動作するのかを実際に理解したいだけで、コピー/貼り付けできるコードを用意するのではなく、また、名前のリストは、Androidが使用するための文字列の配列として終わらなければならないことに留意してください。ここで私が今使っている機能はあります(チュートリアルからコピー/ペーストされています。ひどく編集されているため、読み込みができません)。実際にはリストビューは空になります。少なくとも、それは前よりはましだと、それはあなたがgameListにfstNmElmnt.toStringを()を追加する時点で、あなたのコードでは...もうしかし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

+0

これは学習の練習でない限り、1つのXPath式で簡単に達成できることを行うために、低レベルのDOMインターフェイスを使いこなすことは本当にありません。 (低レベルのツリーナビゲーションを使用したい場合でも、DOMは最悪の選択肢です - JDOMとXOMははるかに使いやすく、高速です) –

+0

実際、AndroidにはXPathがありません。だから私は低レベルのものをしなければならない。 –

答えて

1

をクラッシュしない、それはタグに対応する要素がありますゲームのあなたの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

Simpleを使用してみてください:あなたは、ドキュメントの他の部分で<名>タグを持っている、またはこの段階では他の処理のため<ゲーム>要素を必要としない限り、次の(非常に簡単)のコードを使用することができます。 )

0

Robert Massaioli's answerは、シンプルな使い方についての洞察を提供します。

覚えておくべき重要なことは、Simple XMLは、クラスを使用して論理的に生成できる任意の構造に従うことができることです。したがって、エラーインタフェースを使用するBaseClassを作成し、デコレータパターンを適用して、与えられたものを知る必要がある実装オブジェクトがなくても、すべてのものを具体的なエラークラスに渡すことができます。

これはおそらく意味がありませんでした。どのように私はちょうどいい...私はちょうど去っていきましたと私は考えていたまさに実装されており、ここにある...あなたのショーについての結果(完全なコードリンク):

メインファイル:

パッケージコム。 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例外{ シリアライザserial = new Persister(); ResC resc = serial.read(ResC.class、新しいファイル( "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. == "); 
} 

} 単純に実行され、結果が表示されます。

ベースオブジェクト。Javaクラス:

パッケージcom.massaiolir.simple.iface。

輸入org.simpleframework.xml.Element。

public class BaseObject implements Error { @Element(name = "Err"、必須= false、型= ConcreteError.class) プライベートエラーerr;

@Override 
public String getErrorText() { 
    return err.getErrorText(); 
} 

@Override 
public void setErrorText(String errorText) { 
    err.setErrorText(errorText); 
} 

} これは、「のErr」を望んでいるならば、すべてが拡張しなければならないことクラスです。

エラーインタフェース:

パッケージcom.massaiolir.simple.iface。

パブリックインターフェイスエラー{ ボイドsetErrorText(文字列ERRORTEXT)。

String getErrorText(); 

} ConcreteErrorクラス:

パッケージcom.massaiolir.simple.iface。

輸入org.simpleframework.xml.Attribute。

public class ConcreteError implements Error { @Attribute プライベート文字列テキスト。

@Override 
public String getErrorText() { 
    return text; 
} 

@Override 
public void setErrorText(String errorText) { 
    this.text = errorText; 
} 

} 実際の実装クラスはこの後になります。上記のクラスで実際の作業が処理されているので、それらはかなり簡単です。

コンクラス:

パッケージcom.massaiolir.simple.iface。

パブリッククラスCONはBaseObject {

} CONLISTクラス延び:

パッケージcom.massaiolir.simple.ifaceと、

import java.util.ArrayList;

輸入org.simpleframework.xml.ElementList。

public class ConListはBaseObjectを拡張します。{ @ElementList(エントリ= "Con"、インライン= true) public ArrayList cons; } ConResクラス:

パッケージcom.massaiolir.simple.iface;

輸入org.simpleframework.xml。素子;

public class ConResはBaseObjectを拡張します。 @Element(name = "ConList") public ConList conList; } ResCクラス:

パッケージcom.massaiolir.simple.iface;

輸入org.simpleframework.xml.Element。 import org.simpleframework.xml.Root; パブリッククラスRESCはBaseObject { @Element(名= "ConRes") 公衆ConResのconResを拡張

@Root。 } それはそれだけです。かなりシンプルな権利。私は10分ですべてを叩くことができました。私があなたに与えているコードを書いていたときよりも、実際にこの応答を書くのにもっと時間がかかりました。あなたが私がちょうど書いたコードについて何かを理解していないなら、私に知らせてください。私はこのことが、あなたがこのようなことをやっていく方法を理解するのに役立つことを願っています。

関連する問題