2016-05-29 1 views
1

Я работаю с небольшим проектом, graphipedia (для импорта дампов википедии), и я использую синтаксический анализатор stax для импорта дампа wikiquote.StringBuilder - метод добавления перестает работать в определенной точке

В какой-то момент процесса я прочитал несколько текстовых символов (между < текстом> и </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) и запустите ExtractLinks от Eclipse или аналогичный идее, чтобы правильно отладить код.

+0

Извините, объяснил это мне сам удалил мой комментарий, – Turo

+0

Не могли бы вы разместить образцы данных? – Turo

+0

Я установил ссылку для данных образца. Он слишком велик, чтобы вставить его в мой вопрос. – chomp

ответ

0

Это была большая ошибка меня, потому что я не знал, как Eclipse обрабатывает переменные String в режиме отладки. Append работал отлично, но String была слишком большой, чтобы видеть это, и в таком случае 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;     

не получил AssertionError, но выход

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

Смежные вопросы