Я утомлен с малышом projecto, graphipedia (он используется, чтобы иметь значение dumps wikipedia или какого-то другого wiki), и через этот я импортирую dump wikiquotes. Этот projecto использует внутри stax для parsear xml (а именно, dump)
В каком-то моменте процесса чтения xml, код читает символы (между
Здесь - код:
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 interestingElements;
public SimpleStaxParser(List 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 elementStack = new LinkedList();
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 есть стоимость в "count" 30643, "способность" 64254, и у text, который нужно добавлять, есть длина 1352.
Информация, в которой parser работает, - в: https://es.wikiquote.org / ватт / index.php? title=The_Matrix&action=edit (он очень большой, чтобы показывать ее прямо здесь)
Шаги, чтобы воспроизводить эту проблему: Получать dump, загружаться graphipedia, разжимать это и строить это с maven (mvn package
). Corrrer ExtractLinks
с Eclipse
или сходный IDE, в команде мочь делать правильный debug кода.
Это была моя ошибка, из-за незнания как Eclipse
манипулируй, сделав debug, контент переменных типа String. Append добавлял контент в StringBuilder
правильно, что он переместил, что, в такое длинное существо string, Eclipse
он показывает нас до определенной степени и отсюда в больше образце "...".
Examinango стоимость переменной как будто он будет менять это, я смог видеть истинную стоимость переменной textBuffer
.
Благодаря всем людям, которые помогли мне!
Мне кажется проблема находится в textBuffer.setLength(0);
, когда parser инициализирует чтение tag, ты определяешь длину как 0 из контента StringBuilder
. Удали эту линию и попытайся снова.
switch (reader.next()) {
case XMLEvent.START_ELEMENT:
elementStack.push(reader.getName().getLocalPart());
//textBuffer.setLength(0);
break;
Пример setLength () , если у нас есть string с длиной 17
string = StackOverFlow.com
length = 17
, Если мы определяем StringBuilder с одним .setLength(5)
, такие obtendrГ-хозяева как результат:
string = Stack
length = 5
Проблема - в вызове StringBuilder#setLength(0)
. Это будет отлаживать весь контент, который есть в StringBuilder
. Ты можешь видеть это из-за cГіdigo использованный в AbstractStringBuilder
(основанный на HotSpot v1.8.0_65):
public void setLength(int newLength) {
//validación del valor ingresado
if (newLength < 0)
throw new StringIndexOutOfBoundsException(newLength);
//asegura que haya espacio suficiente en la estructura (un arreglo)
ensureCapacityInternal(newLength);
//el resto de caracteres serán el caracter vacío: \0
if (count < newLength) {
Arrays.fill(value, count, newLength, '\0');
}
//se cambia la longitud como contenedor
count = newLength;
}
Лучшее в этих случаях состоит в том, чтобы проверять, есть ли у переменной контент, заставлять что-то с этим контентом, и потом re инициализировать элемент:
case XMLEvent.START_ELEMENT:
elementStack.push(reader.getName().getLocalPart());
if (textBuffer.length() > 0) {
//escribir los datos o lo que sea en algún lado
}
//textBuffer.setLength(0);
//esto libera el contenido mejor que utilizando setLength a 0
//ayuda al GC a retomar la memoria contenida por el objeto StringBuilder anterior
textBuffer = new StringBuilder();
break;
reader.next()
читает и находит XMLEvent.START_ELEMENT
и инициализирует переменную textBuffer
, потом читает контент XML, потом читает XMLEvent.START_ELEMENT
снова благодаря тому, что есть укрытый элемент и отлаживает контент textBuffer
. Я рекомендую тебе реализовывать соответствующий debug на контенте твоего XML, чтобы видеть qu и # 233; вот то, за чем оно последует. Если бы StringBuilder#append
действительно не удался, он, потому что не существует м и # 225; s память и бросаться и # 237; в один OutOfMemoryError
, но эта не кажется твоим situaci и # 243; n.
–
29.05.2016, 23:15