Utworzono klasę, która rozszerza klasę DefaultHandler SaxParser. Moim zamiarem jest przechowywanie danych wejściowych XML w serii obiektów przy jednoczesnym zachowaniu integralności danych oryginalnych danych XML. Podczas testowania zauważam, że niektóre dane węzła były obcinane arbitralnie na wejściu.Issue Parsing XML Document using SaxParser - limit znaków 2047?
Na przykład:
Input: <temperature>-125</temperature> Output: <sensitivity>5</sensitivity>
Input: <address>101_State</city> Output: <address>te</address>
Aby jeszcze bardziej skomplikować rzeczy, powyższe błędy występuje „losowo” do 1 z każdych ~ 100 wystąpień tych samych znaczników XML. Oznacza to, że wejściowy plik XML zawiera około 100 znaczników, które zawierają <temperature>-125</temperature>
, ale tylko jeden z nich generuje wyjście o wartości <sensitivity>5</sensitivity>
. Pozostałe znaczniki dokładnie produkują <sensitivity>-125</sensitivity>
.
Mam nadpisane abstrakcyjnych "znaków (char [] ch, int start, int length)" metoda prosta grab zawartości znaków pomiędzy znacznikami XML:
public void characters(char[] ch, int start, int length)
throws SAXException {
value = new String(ch, start, length);
//debug
System.out.println("'" + value + "'" + "start: " + start + "length: " + length);
}
Moi println oświadczenia następujący wynik dla specyficzna tag temperatura, która skutkuje błędnym wyjścia:
> '-12'start: 2045length: 3 '5'start:
> 0length: 1
Ten mówi mi, że metody znaków jest wywołana dwukrotnie dla tego konkretnego elementu xML. Jest on wywoływany raz dla wszystkich innych znaczników xml. Wartość "start" linii secong oznacza, że znaki char [] są resetowane w środku tego znacznika XML. A metoda znaku jest wywoływana ponownie z nowym char [].
Czy ktoś jest zaznajomiony z tym problemem? Zastanawiałem się, czy osiągnąłem granicę zdolności char []. Ale szybkie zapytanie sprawia, że jest to mało prawdopodobne. Moja char [] resetując wydaje się być na ~ 2047 znaków
Dzięki,
LB
podziękowania. Wygląda na to, że ta sugestia jest poprawna. –
Prawidłowa odpowiedź. Inną możliwością rozważenia jest przejście do używania parsera Stax (javax.xml.stream.XMLStreamReader) i włączenie "trybu koalescencyjnego" - daje to wysoką wydajność podobną do SAX, ale bez konieczności ręcznego łączenia tekstu. – StaxMan