解析RSS标记之间的内容时获取java.lang.StringIndexOutOfBoundsException

时间:2013-08-26 18:11:44

标签: java parsing

我有一段内容同时包含html和rss,我想将它们分开并存储在单独的字符串中。所以,我试图根据他们的开始和关闭标签来解析它们,并在rss / rss之间获取内容。

代码适用于html& / HTML。但是我看到rss&的错误/ RSS。

以下是我的代码段。

// parse the responseStr to html
html = responseStr.substring(responseStr.indexOf("<html>"),
responseStr.lastIndexOf("</html>") + 7);
System.out.println("html string"+html );

有人可以指导我下面的代码有什么问题吗?

// parse the responseStr to rss
rss = responseStr.substring(responseStr.indexOf("<rss version="2.0">"),
responseStr.lastIndexOf("</rss>") + 6);
System.out.println("rss string = "+rss );

我得到以下异常:

  java.lang.StringIndexOutOfBoundsException
    at java.lang.String.substring(String.java:1093)

3 个答案:

答案 0 :(得分:4)

substring的来电可能会传递给responseStr的无效索引。在调用substring之前,您需要验证字符串是否实际包含<rss></rss>标记。

试试这个:

String result;
int start = responseStr.indexOf("<rss>");
int end = responseStr.lastIndexOf("</rss>");

if (start != -1 && end != -1)
{
  result = "rss string = " + responseStr.substring(start, end + 6);
}
else
{
  result = "rss string not found";
}

System.out.println(result);

JavaDocs for String.indexOf,我们知道如果字符串没有出现,则会返回-1

答案 1 :(得分:3)

我认为使用

会更容易

StringUtils.substringsBetween(String str,String open,String close)

javadoc

apache commons

示例:

String[] rss= StringUtils.substringsBetween(testHtml, "<rss>", "</rss>");
    for (String s : rss) {
        System.out.println("td rss:" + rss); 
}

public static String substringBetween(String str, String open, String close) {
    if (str == null || open == null || close == null) {
        return null;
    }
    int start = str.indexOf(open);
    if (start != INDEX_NOT_FOUND) {
        int end = str.indexOf(close, start + open.length());
        if (end != INDEX_NOT_FOUND) {
            return str.substring(start + open.length(), end);
        }
    }
    return null;
}

答案 2 :(得分:2)

我建议使用xml解析器而不是代码

public static void main(String[] args) {
    String responseStr = "<rss ...>------content-----</rss>";
    int start = responseStr.indexOf("<rss");
    String content = null;
    if (start != -1) {
        start = responseStr.indexOf(">", start);
        if (start != -1) {
            int end = responseStr.lastIndexOf("</rss>");
            if (end != -1) {
                content = responseStr.substring(start + 1, end);
            }
        }
    }
    if (content != null)
        System.out.println(content);
    else
        System.err.println("Content not found");

}

输出

------content-----