2016-05-29 35 views
1

我正在处理一个小项目,graphipedia(用于导入wikipedia转储),并且我正在使用stax分析器来导入wikiquote转储。StringBuilder - 追加方法在某个点停止工作

在该过程的某个时刻,我已经阅读了一些文本字符(在< text>和</text>之间),并且该代码对StringBuilder变量执行追加方法,但由于某些原因,追加不会向StringBuilder变量添加一个字符。

下面是代码:

package org.graphipedia.dataimport; 

import java.io.FileInputStream; 
import java.io.IOException; 
import java.io.InputStream; 
import java.util.LinkedList; 
import java.util.List; 

import javax.xml.stream.XMLInputFactory; 
import javax.xml.stream.XMLStreamException; 
import javax.xml.stream.XMLStreamReader; 
import javax.xml.stream.events.XMLEvent; 

import org.codehaus.stax2.XMLInputFactory2; 

public abstract class SimpleStaxParser { 

    private static final String STDIN_FILENAME = "-"; 
    private static final XMLInputFactory XML_INPUT_FACTORY = XMLInputFactory2.newInstance(); 

    private final List<String> interestingElements; 

    public SimpleStaxParser(List<String> interestingElements) { 
     this.interestingElements = interestingElements; 
    } 

    protected abstract void handleElement(String element, String value); 

    public void parse(String fileName) throws IOException, XMLStreamException { 
     if (STDIN_FILENAME.equals(fileName)) { 
      parse(System.in); 
     } else { 
      parse(new FileInputStream(fileName)); 
     } 
    } 

    private void parse(InputStream inputStream) throws IOException, XMLStreamException { 
     XMLStreamReader reader = XML_INPUT_FACTORY.createXMLStreamReader(inputStream, "UTF-8"); 
     try { 
      parseElements(reader); 
     } finally { 
      reader.close(); 
      inputStream.close(); 
     } 
    } 

    private void parseElements(XMLStreamReader reader) throws XMLStreamException { 
     LinkedList<String> elementStack = new LinkedList<String>(); 
     StringBuilder textBuffer = new StringBuilder(); 

     while (reader.hasNext()) { 
      switch (reader.next()) { 
      case XMLEvent.START_ELEMENT: 
       elementStack.push(reader.getName().getLocalPart()); 
       textBuffer.setLength(0); 
       break; 
      case XMLEvent.END_ELEMENT: 
       String element = elementStack.pop(); 
       if (isInteresting(element)) { 
        handleElement(element, textBuffer.toString().trim()); 
       } 
       break; 
      case XMLEvent.CHARACTERS: 
       if (isInteresting(elementStack.peek())) { 
        textBuffer.append(reader.getText()); 
       } 
       break; 
      } 
     } 
    } 

    private boolean isInteresting(String element) { 
     return interestingElements.contains(element); 
    } 

} 

那是给我一些麻烦的线,这是一个:

textBuffer.append(reader.getText()); 

在该行,reader.getText()返回如下:

lo que pasó, pasó por una razón... 

'''Neo''': ¿Y qué razón es esa? 

'''Smith''': Yo lo maté, señor Anderson, lo vi morir... Con cierta satisfacción, debo decir. Y luego algo pasó. Algo que sabía que era imposible, pero aún así pasó: usted me destruyó, señor Anderson... Después, cuando supe las reglas, entendí lo que debí haber hecho, pero no lo hice. No podía, fui obligado a quedarme, fui obligado a desobedecer... Y ahora aquí estoy por su culpa, señor Anderson. Por su culpa, ya no soy un agente de este sistema. Por su culpa cambié, me desconecté. Un hombre libre por decir algo, como usted, aparentemente libre. 

'''Neo''': ¡Felicidades! 

'''Smith''': Gracias... Pero, como sabrá, las apariencias engañan, lo cual me regresa a la razón por la que estoy aquí. No estamos aquí por ser libres. Estamos aquí por no ser libres. No hay razón de escapatoria, ni propósitos de negación. Porque, como sabemos, sin propósitos, no existiríamos... 

'''Clones''': Propósito fue lo que nos creó... propósito lo que nos conecta, propósito lo que nos impulsa, lo que nos guía, lo que nos controla, es el propósito lo que define, propósito lo que nos une. 

'''Smith''': Estamos aquí por culpa suya, señor Anderson. Estamos aquí para quitarle lo que trató de quitarnos a nosotros ¡Propósito! 

[[Categoría:Películas]] 

[[en:The Matrix (franchise)]] 
[[sl:Matrica]] 

在执行append方法之前,textBuffer变量的计数值为30643,一个capa城市的64254,并添加文本的长度为1352

其数据解析器工作可以在看到:https://es.wikiquote.org/w/index.php?title=The_Matrix&action=edit(太大了,在这里张贴)


的步骤重现此问题: 获取dump,下载graphipedia,解压缩并使用maven(mvn package)构建它,并从Eclipse或类似ide运行ExtractLinks,以便正确调试代码。

+0

对不起,向我解释了我自己删除了我的评论, – Turo

+0

你能发布样本数据吗? – Turo

+0

我为示例数据添加了一个链接。将它插入我的问题太大了。 – chomp

回答

0

那是一个很大的错误我,因为我不知道Eclipse在调试模式下如何处理String变量。 Append工作得很好,但字符串太大而无法看到它,并且在这种情况下,Eclipse显示字符串,直到某个点后,显示“...”。

我选择了textBuffer变量的值,以便改变它,试图查看实际值,并且该值正好在那里,即从第一个字符到最后一个文件的完整字符串。

非常感谢@turo帮助我的巨大努力。

+0

有关更多信息,请参阅http://stackoverflow.com/questions/2873949/viewing-complete-strings-while-debugging-in-eclipse – chomp

0

发现的星座,但无法重现:

改变一下代码:

 case XMLEvent.CHARACTERS: 
      if (isInteresting(elementStack.peek())) { 
       int sizeBefore = textBuffer.length(); 
       String text = reader.getText(); 
       int textSize = text.length(); 
       textBuffer.append(text); 
       int sizeAfter = textBuffer.length(); 
       assert sizeBefore + textSize == sizeAfter : "Error occured " + sizeBefore + " " + textSize + " :" 
         + text; 
       if (textSize == 1352) { 
        System.out.println(
          "Size before " + sizeBefore + " textSize " + textSize + " sizeafter " + sizeAfter); 
       } 
      } 
      break;     

没有得到Asse田,但输出

Parsing pages and extracting links... 
Size before 30643 textSize 1352 sizeafter 31995 
...........Size before 0 textSize 1352 sizeafter 1352 
...Size before 83963 textSize 1352 sizeafter 85315 
. 
15309 pages parsed in 0 seconds. 
+0

这是从我身边@turo发生的新手错误,它引发了这个问题。对不起,非常感谢您的帮助! – chomp