2017-06-26 14 views
3
public List<String> readRSS(String feedUrl, String openTag, String closeTag) 
      throws IOException, MalformedURLException { 

     URL url = new URL(feedUrl); 
     BufferedReader reader = new BufferedReader(new InputStreamReader(url.openStream())); 

     String currentLine; 
     List<String> tempList = new ArrayList<String>(); 
     while ((currentLine = reader.readLine()) != null) { 
      Integer tagEndIndex = 0; 
      Integer tagStartIndex = 0; 
      while (tagStartIndex >= 0) { 
       tagStartIndex = currentLine.indexOf(openTag, tagEndIndex); 
       if (tagStartIndex >= 0) { 
        tagEndIndex = currentLine.indexOf(closeTag, tagStartIndex); 
        tempList.add(currentLine.substring(tagStartIndex + openTag.length(), tagEndIndex) + "\n"); 
       } 
      } 
     } 
     if (tempList.size() > 0) { 
      if(openTag.contains("title")){ 
       tempList.remove(0); 
       tempList.remove(0); 
      } 
      else if(openTag.contains("desc")){ 
       tempList.remove(0); 
      } 
     } 
     return tempList; 
    } 

私はRSSフィードを読むためにこのコードを書いています。それはすべて正常に動作しますが、パーサがこのような文字を見つけると、&#xD;が壊れます。これは、XMLがエスケープされるため、終了タグを見つけることができないためです。Javaでエスケープ文字をテキストとして読み取る方法は?

コード内でどのように修正できるかわかりません。誰も私がこの問題を解決するのを助けることができますか?

+0

したがって、エスケープ文字をテキストとして読み取ってから、(おそらく)それらをスキップするのは正しいでしょうか? – progyammer

+0

@progyammerはい私はそれらをスキップしたいです。今起こっていることは次のとおりです。RSSリーダーは を参照してから、というタグに到達しないように読み込みを終了し、クラッシュします。 OPを画像で更新しましたので、より明確になりました。 –

+0

うん。それはパーサであるため、エスケープシーケンスとして遭遇したときに何をするのかを行います。何らかの形でそのルールを上書きし、すべてをテキストとして読み込む必要があります。入力の後処理はちょっとだけ増えるでしょう。 – progyammer

答えて

1

問題は、特殊文字&#xD;が改行で、開始タグと終了タグが異なる行に表示されることです。だから、行ごとに読んでいるのであれば、あなたが持っているコードではうまくいきません。

あなたはこのような何かを試すことができます。

StringBuffer fullLine = new StringBuffer(); 

while ((currentLine = reader.readLine()) != null) { 
    int tagStartIndex = currentLine.indexOf(openTag, 0); 
    int tagEndIndex = currentLine.indexOf(closeTag, tagStartIndex); 

    // both tags on the same line 
    if (tagStartIndex != -1 && tagEndIndex != -1) { 
     // process the whole line 
     tempList.add(currentLine); 
     fullLine = new StringBuffer(); 
    // no tags on this line but the buffer has been started 
    } else if (tagStartIndex == -1 && tagEndIndex == -1 && fullLine.length() > 0) { 
     /* 
     * add the current line to the buffer; it is part 
     * of a larger line 
     */ 
     fullLine.append(currentLine); 
    // start tag is on this line 
    } else if (tagStartIndex != -1 && tagEndIndex == -1) { 
     /* 
     * line started but did not have an end tag; add it to 
     * a new buffer 
     */ 
     fullLine = new StringBuffer(currentLine); 
     // end tag is on this line 
    } else if (tagEndIndex != -1 && tagStartIndex == -1) { 
     /* 
     * line ended but did not have a start tag; add it to 
     * the current buffer and then process the buffer 
     */ 
     fullLine.append(currentLine); 
     tempList.add(fullLine.toString()); 
     fullLine = new StringBuffer(); 
    } 
} 

を考えると、このサンプル入力:なるtitleためtempList

<title>another &#xD; 
title 0</title> 
<title>another title 1</title> 
<title>another title 2</title> 
<title>another title 3</title> 
<desc>description 0</desc> 
<desc>another &#xD; 
description 1</desc> 
<title>another title 4</title> 
<title>another &#xD; 
another line in between &#xD; 
title 5</title> 

フルライン:

<title>another &#xD;title 0</title> 
<title>another title 1</title> 
<title>another title 2</title> 
<title>another title 3</title> 
<title>another title 4</title> 
<title>another &#xD;another line in between &#xD;title 5</title> 

desc用:

<desc>description 0</desc> 
<desc>another &#xD;description 1</desc> 

RSSフィード全体のパフォーマンスをテストする必要があります。また、特殊文字はエスケープされないことにも注意してください。

関連する問題