مشكلة التحليل مع Sax Parser (javax.xml.parsers.saxparser) على Android API 1.5

StackOverflow https://stackoverflow.com/questions/2573542

  •  24-09-2019
  •  | 
  •  

سؤال

عند استخدام محلل ساكس ، يفشل التحليل عندما يكون هناك "في محتوى العقدة. كيف يمكنني حل هذا؟ هل أحتاج إلى تحويل جميع الأحرف؟

بمعنى آخر ، في أي وقت لدي اقتباس في العقدة:

 <node>characters in node containing "quotes"</node>

يتم ذبح تلك العقدة في صفائف أحرف متعددة عندما يقوم المعالج بتحليلها. هل هذا السلوك الطبيعي؟ لماذا يجب أن تسبب الاقتباسات مثل هذه المشكلة؟

هنا هو الرمز الذي أستخدمه:

import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.xml.sax.InputSource;
import org.xml.sax.XMLReader;

 ...


HttpGet httpget = new HttpGet(GATEWAY_URL + "/"+ question.getId());
          httpget.setHeader("User-Agent", PayloadService.userAgent);
          httpget.setHeader("Content-Type", "application/xml");

          HttpResponse response = PayloadService.getHttpclient().execute(httpget);
          HttpEntity entity = response.getEntity();

          if(entity != null)
          {        
              SAXParserFactory spf = SAXParserFactory.newInstance();
              SAXParser sp = spf.newSAXParser();            
              XMLReader xr = sp.getXMLReader();            

              ConvoHandler convoHandler = new ConvoHandler();
              xr.setContentHandler(convoHandler);             
              xr.parse(new InputSource(entity.getContent()));                                


              entity.consumeContent();         

               messageList = convoHandler.getMessageList();


          }
هل كانت مفيدة؟

المحلول

الخطأ في فئة المعالج الخاصة بك المشار إليها في أحدث تعليق لك.

هناك خطأ شائع في كتابة ContentHandler هو افتراض أن طريقة الأحرف لن يتم استدعاؤها إلا مرة واحدة مع جميع بيانات الأحرف. في الواقع يمكن أن يطلق عليه عدة مرات مع قطع بيانات الأحرف ، والتي يجب عليك جمعها. التقطيع إلى صفائف أحرف متعددة هو سلوك طبيعي.

ربما تحتاج إلى بدء جامع (ربما stringBuffer) في طريقة النشر الخاصة بك ، وجمع البيانات فيها في طريقة شخصياتك ، ثم استخدم البيانات في طريقة EndElement الخاصة بك ، والتي يجب أن تكون حيث تم استدعاء message.settext في تعليقك.

نصائح أخرى

تم تقديم الإجابة الصحيحة بالفعل (لا توجد ضمانات في بيانات الأحرف التي يتم إرسالها كحدث واحد). شيء واحد يجب مراعاته هو أنه ربما يكون استخدام محلل مع واجهة Stax (أو XMLPull) "سحب" يعمل بشكل أفضل ؛ هناك طريقة لإجبار محلل Stax على ضمان الإبلاغ عن جميع بيانات char على أنها رمزية واحدة (تمكين الفحم). تعتبر Stax (أو محللات السحب عمومًا) استخدامًا أكثر ملاءمة قليلاً من SAX ، وهناك تطبيقات تعمل على Android أيضًا (Android SDK حتى يحزم XMLPull على ما أعتقد) ؛ يجب أن تعمل Woodstox و Aalto.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top