2017-05-21 15 views
0

私はjavaを使い慣れていて、確かにjsoupを初めて使っています。私のプログラムのこの予備ステップでは、私は自分のコンテンツを出力するために使用できるオブジェクトにWebベースのXMLファイルを取得しようとしています。 (これは巨大なXMLファイルであり、最終的にフィルタを追加できるようにしたい)jsoupでXMLを読む

ここにいくつかのサンプルXMLがあります。

<spell> 
    <name>Acid Splash</name> 
    <level>0</level> 
    <school>C</school> 
    <time>1 action</time> 
    <range>60 feet</range> 
    <components>V, S</components> 
    <duration>Instantaneous</duration> 
    <classes>Sorcerer, Wizard, Fighter (Eldritch Knight), Rogue (Arcane Trickster)</classes> 
    <text>You hurl a bubble of acid. Choose one creature within range, or choose two creatures within range that are within 5 feet of each other. A target must succeed on a Dexterity saving throw or take 1d6 acid damage.</text> 
    <text /> 
    <text>This spells damage increases by 1d6 when you reach 5th Level (2d6), 11th level (3d6) and 17th level (4d6).</text> 
    <roll>1d6</roll> 
    <roll>2d6</roll> 
    <roll>3d6</roll> 
    <roll>4d6</roll> 
</spell> 
<spell> 
    <name>Aid</name> 
    <level>2</level> 
    <school>A</school> 
    <time>1 action</time> 
    <range>30 feet</range> 
    <components>V, S, M (a tiny strip of white cloth)</components> 
    <duration>8 hours</duration> 
    <classes>Artificer, Cleric, Paladin</classes> 
    <text>Your spell bolsters your allies with toughness and resolve. Choose up to three creatures within range. Each target's hit point maximum and current hit points increase by 5 for the duration.</text> 
    <text /> 
    <text>At Higher Levels: When you cast this spell using a spell slot of 3rd level or higher, a target's hit points increase by an additional 5 for each slot level above 2nd.</text> 
</spell> 

これまでのコードです。私はこれが何をしたいのか

private class Description extends AsyncTask<Void, Void, Void> { 
    String desc; 



    @Override 
    protected Void doInBackground(Void... params) { 
     try { 
      // Connect to the web site 
      Document document = Jsoup.parse(new URL(url).openStream(), "UTF-8", "", Parser.xmlParser()); 
      Elements elements = document.getElementsMatchingOwnText("name"); 
      // Using Elements to get the Meta data 
      for(Element e : elements) { 
       desc = desc +", "+ e; 
      } 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     return null; 
    } 

    @Override 
    protected void onPostExecute(Void result) { 
     // Set description into TextView 
     TextView txtdesc = (TextView) findViewById(R.id.desctxt); 
     txtdesc.setText(desc); 
    } 
} 

出力: 出力::

<text> 
This spells damage increases by 1d6 when you reach 5th Level (2d6), 11th level (3d6) and 17th level (4d6). 
</text>, <text> 
At Higher Levels: When you cast this spell using a spell slot of 3rd level or higher, a target's hit points increase by an additional 5 for each slot level above 2nd. 
</text> 

答えて

3

getElementsMatchingOwnTextに基づく要素を見つけようと、それ実際に出力がどのようなアシッドスプラッシュ、援助

それ自身のテキストです。FooまたはBarに基づいて<name>Foo Bar</name>を検索したいときのようです。代わりに、実際の要素がコールe.text()を表すテキストを取得するためにもCSSクエリ形式をサポートしてい

  • select
  • またはdocument.getElementsByTag("name")

を使用しています。

ところで、連結でループ内に文字列を作成しないでください。各反復では、これは古い結果(長い可能性があります)をコピーして小さな文字列を追加して新しい文字列を作成する必要があります。代わりにStringBuilderappendの新しいコンテンツを使用してください(このクラスはchar[]のラッパーで、サイズがかなり大きいので、配列の長さが2倍のサイズに変更された場合は、テキストを追加するだけです)。完了したら、toStringメソッドを呼び出して結果をStringとして取得します。

だから何したいことは、より

Elements elements = document.getElementsByTag("name"); 
StringBuilder sb = new StringBuilder(); 
for(Element e : elements) { 
    sb.append(e.text()).append(", "); 
} 
desc = sb.toString(); 
+0

のようにこれは、私はそれを解決しようとしていた方法よりもずっといいです。 +1をstringbuilderに追加してくれました。この最後の部分は、特定の値を持つ特定の子を持つ要素を引き出す条件を追加する方法です。 (これはif(specificChildElement.text()。equals( "4"){}? – kyle

+0

@kyleこんにちは。これは新しい問題ですので別の質問が必要です(これに関連していても)。セレクタの詳細については、https:/ /で確認することができます。:(:seletor)セレクタを探しています。 /jsoup.org/cookbook/extracting-data/selector-syntax – Pshemo