2011-07-08 9 views
0

これは単純な修正です(私はおそらくそうだと思いますが)。私とGoogleの数時間後、私は空になりました。Android XML + Object Storage

私はサーバーから取得したXMLファイルを持っています(クッキー処理のためにhttpclientを使用しています)。 XMLを検索したいと思っています。 XMLは、属性を持つトランプのセットを定義します。一例として、このようなものになります。

<CardInfo> 
    <Type> 
      Player 
    </Type> 
    <ID> 
      674868 
    </ID> 
</CardInfo> 

この中には明らかにいくつかの属性がありますが、例を説明するだけです。 私はXMLごとにこれらの 'cardinfo'がたくさんあるかもしれませんが、私はXMLをフィルタリングして各カードを保存し、カードの属性をアクセスしやすい形式にしたいと思います。私は明らかにこれのすべてが私のために行われるとは思っていませんが、どのような解決策にとってもコンテキストが重要であると考えました。

これはご迷惑をおかけして申し訳ありませんが、XMLパージや保存はAndroidのnoobyでは難しいです! (なぜ彼らは私たちに神の愛のためにPythonでそれをさせることができないのでしょうか?)

答えて

1

XML pull-parserを使用してください。 XML文書は、論理パーツ、パーツごとのパーツ(イベント)です。したがって、各CARDINFO要素のために、あなたは新しいCardIntoオブジェクトを作成し、要素名「種類」のあなたはCARDINFOタイプを設定し、要素名「ID」のためにあなたがCARDINFOタイプを設定など

が読ん追加、更新、およびオブジェクトへのメソッドの書き込み、またはXMLからの読み取り/書き込み用のスタンドアロンクラスの作成:

この例はStAX API用です差異名がある)。

private void readHeaders(XMLStreamReader reader) throws XMLStreamException { 
    int level = 1; 

    int event; 
    do { 
     event = reader.next(); 
     if(event == XMLStreamConstants.START_ELEMENT) { 
      level++; 

      String localName = reader.getLocalName(); 

      if(localName.equals("Header")) { 
       CodeRequestHeader header = new CodeRequestHeader(); 
       header.setName(reader.getAttributeValue(null, "name")); 
       header.setValue(reader.getAttributeValue(null, "value")); 
       headers.add(header); 
      } 
     } else if(event == XMLStreamConstants.END_ELEMENT) { 
      level--; 
     } 
    } while(level > 0); 
} 

は今このようなものを行うための複数の方法があるコードを使用して

<Headers> 
    <Header name="" value=""/> 
    <Header name="" value=""/> 
    <Header name="" value=""/> 
</Headers> 

、しかし重要:

public void read(XMLStreamReader reader) throws XMLStreamException { 
    int event; 

    // read to the first tag, so we are at level 1 
    do { 
     event = reader.next(); 
     if(event == XMLStreamConstants.START_ELEMENT) { 
      break; 
     } 

    } while(reader.hasNext()); 

    int level = 1; 
    do { 
     event = reader.next(); 
     if(event == XMLStreamConstants.START_ELEMENT) { 
      level++; // increment 

      String localName = reader.getLocalName(); 

      if(localName.equals("Domain")) { 
       event = reader.next(); 
       if(event == XMLStreamConstants.CHARACTERS) { 
        domain = reader.getText(); 
       } 
      } else if(localName.equals("URL")) { 
       event = reader.next(); 
       if(event == XMLStreamConstants.CHARACTERS) { 
        url = reader.getText(); 
       } 
      } else if(localName.equals("Headers")) { 
       readHeaders(reader); 
       level--; 
      } else throw new IllegalArgumentException("Unexpected element " + localName + " at " + reader.getLocation()); 
     } 


     if(event == XMLStreamConstants.END_ELEMENT) { 
      level--; // decrement 
     } 
    } while(level > 0); // simple level check 


} 

解析サブタイプと呼ばれるヘッダ:

MyObjectには

ものは次のとおりです:

  1. 最初にレベル1に進みます。 1
  2. 開始および終了要素にインクリメントとデクリメントレベルレベルが
  3. 使用whileループを制御するためのレベル正しいように、レベル限り継続ルート要素
  4. スタートレベルでDO-whileループを読み取ります> 0
  5. サブ要素の場合(つまり、オブジェクトエンティティにマップされた複数のタグが含まれているタグがある場合)、手順2〜4を繰り返す新しいメソッドを作成します。メソッドが使用されている場合、レベルを1つ減らします。

このパターンを使用すると、n次元のXML文書を規則正しく厳密な適切な方法でプル・パースできます。厳密に言えば、ルールはreadHeadersメソッドの 'readHeader'メソッドでなければならないことを意味しますが、Headerエレメントにサブエレメントがない場合は不要です。お楽しみください;)

+0

これはすごいです - 非常にポインタのおかげで! :D – Chris

+0

私はストリームを取得することができ、アイテムを取得するためにXMLプルパーサーを使用しました。これをsystemoutに出力しました。オブジェクトを作成して保存するにはどうすればよいでしょうか? – Chris

+0

se更新された返信 – ThomasRS

関連する問題