Java 返回空字符串的SAX解析器

Java 返回空字符串的SAX解析器,java,rss,sax,Java,Rss,Sax,我试图从RSS提要中提取数据。RSS链接- 以下是我的默认处理程序的字符方法 public void characters(char[] ch, int start, int length) { String text = ""; for (int i=0; i<length; i++) text += ch[start+i]; } 公共无效字符(char[]ch,int-start,int-length){ 字符串文本=”; 对于(inti=0;i,我

我试图从RSS提要中提取数据。RSS链接-

以下是我的默认处理程序的字符方法

public void characters(char[] ch, int start, int length) {
    String text = "";
    for (int i=0; i<length; i++)
        text += ch[start+i];

}
公共无效字符(char[]ch,int-start,int-length){
字符串文本=”;

对于(inti=0;i,我们不清楚如何从RSS的SAX表示形式到这里;或者,就这一点而言,您做了什么来验证您是否访问了URL、获取并解析了一些RSS


但该方法似乎与Java API在字符串构造函数中所能做的一样:

对于单个文本节点,
characters
方法可能会被多次调用。请使用以下内容:

private StringBuilder stringBuilder; // or Deque<StringBuilder> for nested elements

public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {

  if ("...".equals(qName)) {
      stringBuilder = new StringBuilder();
  }

}

public void characters(char ch[], int start, int length)  {
  if (stringBuilder != null)
     stringBuilder.append(ch, start, length);
}

public void endElement(String uri, String localName, String qName) {
  if ("...".equals(qName)){
    String s = stringBuilder.toString();
  }
  stringBuilder = null;
}
private StringBuilder StringBuilder;//或为嵌套元素定义
public void startElement(字符串uri、字符串localName、字符串qName、属性)引发SAXException{
如果(“…”等于(qName)){
stringBuilder=新的stringBuilder();
}
}
公共无效字符(字符ch[],整数开始,整数长度){
如果(stringBuilder!=null)
stringBuilder.append(ch,start,length);
}
公共void endElement(字符串uri、字符串localName、字符串qName){
如果(“…”等于(qName)){
字符串s=stringBuilder.toString();
}
stringBuilder=null;
}

用于包含文本节点的元素的值。根据您使用的命名空间,您可能必须使用
qName
对应的
localName

<代码>文本<代码>是一个局部变量。当方法返回时,它丢失了。顺便说一下,这是低效的。您正在为每个字符创建一个新的临时<代码>字符串< /代码>实例。考虑用“代码>文本=新StringBuilder(text))替换循环。追加(CH,开始,长度)。toString()
完成整个工作。更好的做法是为整个解析保留一个
StringBuilder
,并仅在需要时创建一个
String
。您是否知道
start
length
参数以及一个文本节点的部分可能多次调用处理程序方法的事实?链接我给的是char[]构造函数,但同一页的构造函数有一个位置和长度。至于这个字符串一旦创建,将如何使用,这确实是这里的问题,不是吗?为了清楚起见,我将用类似于
if(“…”.equals(qName))
的调用替换
if(hassignificantextcontent(uri,localName,qName))
其中该方法是提问者必须充满生命的占位符方法。一般来说,将条件单独放入方法中比在
startElement
endElement
方法中重复它更可取。让我们看看你想要元素的文本
abc
,然后你会使用
“foo”.equals(qName)
。注意,如果需要嵌套的文本元素,则需要一堆StringBuilder,而不是单个字段。很明显,情况可能是这样的。我只建议将其封装到它自己的方法中。
StringBuilder
用法的要求取决于您实际执行的操作。例如,如果您构建了(类似DOM的)树中,
String
节点是在下行或遇到同级节点时创建和插入的。这样,您就不需要堆栈,但即使在
startElement
上,您也可能必须创建
String
节点。字符串是不可变的。您需要构建缓冲区(或任何其他类似“流”的数据结构)。您需要一个堆栈来构建XML结构,如
abcabc
。无论如何,这只是我使用了很长(很长)时间的习惯用法。只有一次使用其他流式方法作为文本节点,超过10 GB:)似乎您不理解我的语句。如果您在降序之前创建
字符串,例如,将其添加到(类似DOM的)中树或要执行任何提交操作,都不需要缓冲区堆栈,因为在创建
字符串
后缓冲区就可以重复使用了。通常使用SAX解析器而不是DOM树,因为一次不需要内存中的所有数据…