【问题标题】:Getting java.lang.StringIndexOutOfBoundsException while parsing content between RSS tags解析 RSS 标签之间的内容时获取 java.lang.StringIndexOutOfBoundsException
【发布时间】:2013-08-29 07:24:15
【问题描述】:

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

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

下面是我的代码 sn-p。

// 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)

【问题讨论】:

  • 我看到错误是什么意思 - 另外,您可以发布您要解析的文本吗?
  • 为什么不使用库?一个 xml 解析器至少可以让你使用 xpath
  • 您看到了什么错误?请在问题中添加它们
  • 如果你的输入字符串是&lt;rss&gt; ... &lt;/rss&gt;,上面的代码对我有用。请发布您的输入字符串。
  • 机会是responseStr.lastIndexOf("&lt;/rss&gt;") + 6 不存在

标签: java parsing


【解决方案1】:

您对substring 的调用很可能被传递给您的responseStr 的无效索引。在调用 substring 之前,您需要验证您的字符串是否确实包含 &lt;rss&gt;&lt;/rss&gt; 标签。

试试这个:

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

【讨论】:

  • 我确实有 rss 字符串,但是,当我使用您的代码时,它会打印 rss string not found.
  • @smiley 如果正在打印“rss string not found”,则缺少一个或两个 rss 标签。您需要检查您的字符串。您还可以更改上面的代码,以告诉您具体缺少哪些标签(打开或关闭)。
  • 啊.. 我只是注意到我得到的 rss 标签是 而不是 如上所述。如何在代码中指定它?我想我可能需要转义字符,因为我不能直接使用 version="2.0"。
  • 非常感谢卢克!我试过这个,我知道它很粗糙—— responseStr.indexOf("
    如果您只想使用indexOf,我建议您使用"&lt;rss" 作为搜索字符串,而不是"&lt;rss version="
【解决方案2】:

我认为使用会更容易

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;
}

【讨论】:

    【解决方案3】:

    我会推荐 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-----
    

    【讨论】:

      猜你喜欢
      • 2013-11-11
      • 1970-01-01
      • 2015-09-17
      • 2012-04-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-02
      • 1970-01-01
      相关资源
      最近更新 更多