2009-09-29 9 views
6

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

Odpowiedz

8

characters callback method nie musi być wyposażony w kompletną fragmentu danych przez SAX Parser. Analizator składni może wielokrotnie wywoływać metodę characters(), wysyłając porcję danych na raz.

The resolution is to accumulate all the data in a buffer, aż do następnego połączenia dzieje się z inną metodą (połączenie bez znaków).

+0

podziękowania. Wygląda na to, że ta sugestia jest poprawna. –

+0

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

3

Spędziłem 2 całe dni szukając rozwiązania.

zmienić znaki metody to:

public void characters(char[] ch, int start, int length) throws SAXException { 

    if(value == null) 
    value = new String(ch, start, length); 
    else 
    value += new String(ch, start, length); 

    //debug 
    System.out.println("'" + value + "'" + "start: " + start + "length: " + length); 

} 

a jej zrobić !!!

0

Upewnij się dodać value = ""; na koniec endElementMethod

public void endElement(String uri, String localName, String qName) throws SAXException 
{ 
    ... 
    value = ""; 
}