2013-08-27 1 views
1

Я разбираю xml-ответ, который имеет почти 90000 символов в приложении для Android, используя SaxParser. xml выглядит следующим образом:Почему некоторые символы отсутствуют, когда я разбираю тэг xml с помощью SaxParser?

<Registration> 
    <Client> 
     <Name>John</Name> 
     <ID>1</ID> 
     <Date>2013:08:22T03:43:44</Date> 
    </Client> 
    <Client> 
     <Name>James</Name> 
     <ID>2</ID> 
     <Date>2013:08:23T16:28:00</Date> 
    </Client> 
    <Client> 
     <Name>Eric</Name> 
     <ID>3</ID> 
     <Date>2013:08:23T19:04:15</Date> 
    </Client> 

    ..... 
</Registration> 

Иногда парсер пропускает некоторые символы из тега даты. Вместо того, чтобы давать 2013: 08: 23T19: 04: 15 назад, он дает 2013: 08: 23T назад. Я пытался пропустить все пробелы из ответа XML строку, используя следующую строку кода:

responseStr = responseStr.replaceAll("\\s",""); 

Но тогда я получаю следующее исключение:

Parsing exception: org.apache.harmony.xml.ExpatParser$ParseException: At line 1, column 16: not well-formed (invalid token) 

Ниже приведен код, я использую для синтаксического анализа:

try { 
      SAXParserFactory factory = SAXParserFactory.newInstance(); 
      SAXParser saxParser = factory.newSAXParser(); 

      DefaultHandler handler = new DefaultHandler() { 
       public void startElement(String uri, String localName,String qName, Attributes attributes) throws SAXException { 
        tagName = qName; 
       } 

       public void endElement(String uri, String localName, String qName) throws SAXException { 

       } 

       public void characters(char ch[], int start, int length) throws SAXException { 
        if(tagName.equals("Name")){ 
         obj = new RegisteredUser(); 
         String str = new String(ch, start, length); 
         obj.setName(str); 
        }else if(tagName.equals("ID")){ 
         String str = new String(ch, start, length); 
         obj.setId(str); 
        }else if(tagName.equals("Date")){ 
         String str = new String(ch, start, length); 
         obj.setDate(str); 

         users.add(obj); 
        } 
       } 

       public void startDocument() throws SAXException { 
        System.out.println("document started"); 
       } 

       public void endDocument() throws SAXException { 
        System.out.println("document ended"); 
       } 
      }; 

      saxParser.parse(new InputSource(new StringReader(resp)), handler); 

     }catch(Exception e){ 
      System.out.println("Parsing exception: "+e); 
      System.out.println("exception"); 

     } 

Любая идея, почему парсер пропускает символы из тега и как я могу решить эту проблему. Заранее спасибо.

+0

Где код? Ошибка в коде, а не в коде анализатора SAX. –

+0

Я также добавил код. – Piscean

+0

Только одно, что один и тот же код работает нормально, когда ответ меньше 60000 символов. Это никогда не создавало проблем – Piscean

ответ

8

Возможно, что characters вызывается более одного раза для любого заданного текстового узла.

В этом случае вам придется самостоятельно конкатенировать результат!

Причина этого в том, что некоторый внутренний буфер анализатора заканчивается, пока есть содержимое текстового узла. Вместо увеличения буфера (который может потребовать много памяти, когда текстовый узел является большим), это позволит обрабатывать клиентский код.

Вы хотите что-то вроде этого:

StringBuilder textContent = new StringBuilder(); 

public void startElement(String uri, String localName,String qName, Attributes attributes) throws SAXException { 
    tagName = qName; 
    textContent.setLength(0); 
} 
public void characters(char ch[], int start, int length) throws SAXException { 
    textContent.append(ch, start, length); 
} 
public void endElement(String uri, String localName, String qName) throws SAXException { 
    String text = textContent.toString(); 
    // handle text here 
} 

Конечно, этот код может быть улучшен только отслеживать содержание текста для узлов вы на самом деле небезразличны.

1

Вы ошибочно полагаете, что все символы в текстовом узле будут считаны сразу и отправлены методу characters(). Это не так. Метод characters() можно вызвать несколько раз для одного текстового узла.

Вы должны добавить все символы в StringBuilder, а затем преобразовать только в String или Date, когда вызывается endElement().

2

Как и другие упомянутые методы characters, можно назвать несколько раз, его реализация САКС-синтаксиса для возврата всех contiguous character data in a single chunk, or they may split it into several chunks. См. Документы SAX Parser characters

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

  • Нет связанных вопросов^_^