org.xmlpull.v1.XmlPullParserException: ожидаемая строка в кавычках Ошибка - PullRequest
0 голосов
/ 11 декабря 2019

Попытка прочитать URL с использованием входного потока. Сам код предназначен для создания списка подкастов из RSS-канала. понятия не имею, почему ошибка продолжает появляться. Попытался напрямую вставить RSS, но это ничего не изменило.

Код:

class RevisedSermonFragment: Fragment(){

    companion object {
        fun newInstance(): RevisedSermonFragment {
            return RevisedSermonFragment()
        }
    }

    private lateinit var recyclerView: RecyclerView
    private lateinit var titleText: TextView
    private var sermonList: ArrayList<RevisedSermonModel> = ArrayList()
    private lateinit var swipeRefreshLayout: SwipeRefreshLayout

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
        val view = inflater.inflate(R.layout.sermon_detail, container, false)

        recyclerView = view.findViewById(R.id.recycler_sermon_detail)
        titleText = view.findViewById(R.id.sermon_title_d)
        titleText.text = "Sermons"
        val decoration = DividerItemDecoration(context, 1)
        recyclerView.addItemDecoration(decoration)
        swipeRefreshLayout = view.findViewById(R.id.sermon_swipe_d)

        recyclerView.layoutManager = LinearLayoutManager(context)

        swipeRefreshLayout.setOnRefreshListener {
            FetchFeedTask().execute(null)
        }
        return view
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        FetchFeedTask().execute(null)
    }

    private fun parseXML(inputStream: InputStream): ArrayList<RevisedSermonModel>{

        var parserFactory: XmlPullParserFactory
        var sermons = ArrayList<RevisedSermonModel>()
        try {
            parserFactory = XmlPullParserFactory.newInstance()
            var parser: XmlPullParser = parserFactory.newPullParser()
            parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, false)
            parser.setInput(inputStream, "UTF-8")
            sermons = processParsing(parser)

        } catch (ex: XmlPullParserException){
            Log.e("XMLPullParser Exception", ex.printStackTrace().toString())
        } catch (ex: IOException){
            Log.e("IOException - RSF", ex.toString())
        } catch (ex: NetworkOnMainThreadException){
            Log.e("NOMTException - RSF", ex.toString())
        }
        return sermons
    }

    @SuppressLint("SimpleDateFormat")
    private fun processParsing(parser: XmlPullParser): ArrayList<RevisedSermonModel>{
        val sermons = ArrayList<RevisedSermonModel>()
        var eventType = parser.eventType
        var currentSermon = RevisedSermonModel()

        loop@ while(eventType != XmlPullParser.END_DOCUMENT) {
            var eltName: String

            when(eventType){
                XmlPullParser.START_TAG -> {
                    eltName = parser.name

                    if ("item" == eltName){
                        currentSermon = RevisedSermonModel()
                        sermons.add(currentSermon)
                    } else if (currentSermon != null){
                        when (eltName) {
                            "title" -> {
                                currentSermon.setTitle( parser.nextText())
                            }
                            "author" -> {
                                currentSermon.setPreacher(parser.nextText())
                            }
                            "link" -> {
                                currentSermon.setUri(parser.nextText())
                            }
                            "pubDate" -> {
                                val pattern = "yyyy-MM-dd"
                                val sdf = SimpleDateFormat(pattern)
                                val date = sdf.format(Date( parser.nextText()))
                                currentSermon.setDate(date)
                            }
                        }
                    }
                }
            }
            eventType = parser.next()
        }
       return sermons
    }

    inner class FetchFeedTask: AsyncTask<Void, Void, Boolean>(){

        private lateinit var urlLink: String

        override fun onPreExecute() {
            swipeRefreshLayout.isRefreshing = true
            urlLink = "http://www.gracechurchmiltonkeynes.org/audio/podcast.xml"
        }

        override fun doInBackground(vararg params: Void?): Boolean {
            if (TextUtils.isEmpty(urlLink)) return false

            try {
                var url = URL("http://www.gracechurchmiltonkeynes.org/audio/podcast.xml")
                var inputStream = url.openConnection().getInputStream()
                sermonList = parseXML(inputStream)
                return true
            } catch (ex: XmlPullParserException){
                Log.e("XMLPullParser Exception", ex.printStackTrace().toString())
            } catch (ex: IOException){
                Log.e("IOException - RSF", ex.toString())
            } catch (ex: NetworkOnMainThreadException){
                Log.e("NOMTException - RSF", ex.toString())
            }
            return false
        }

        override fun onPostExecute(result: Boolean?) {
            swipeRefreshLayout.isRefreshing = false

            if (result!!){
                val sortedList = sermonList.sortedByDescending { revisedSermonModel -> revisedSermonModel.getDate() }
                val adapter = SermonDetailAdapter(context, sortedList)
                recyclerView.adapter = adapter
            }else{
                Toast.makeText(context, "RSS pull failed", Toast.LENGTH_LONG).show();
            }
        }

    }

}

Logcat:

2019-12-11 15:30:38.567 9081-9149/com.llamaless.gracechruchmk W/System.err: org.xmlpull.v1.XmlPullParserException: Expected a quoted string (position:DOCDECL @1:50 in java.io.InputStreamReader@9e8482a) 
2019-12-11 15:30:38.567 9081-9149/com.llamaless.gracechruchmk W/System.err:     at com.android.org.kxml2.io.KXmlParser.readQuotedId(KXmlParser.java:671)
2019-12-11 15:30:38.567 9081-9149/com.llamaless.gracechruchmk W/System.err:     at com.android.org.kxml2.io.KXmlParser.readExternalId(KXmlParser.java:650)
2019-12-11 15:30:38.567 9081-9149/com.llamaless.gracechruchmk W/System.err:     at com.android.org.kxml2.io.KXmlParser.readDoctype(KXmlParser.java:591)
2019-12-11 15:30:38.567 9081-9149/com.llamaless.gracechruchmk W/System.err:     at com.android.org.kxml2.io.KXmlParser.next(KXmlParser.java:421)
2019-12-11 15:30:38.567 9081-9149/com.llamaless.gracechruchmk W/System.err:     at com.android.org.kxml2.io.KXmlParser.next(KXmlParser.java:313)
2019-12-11 15:30:38.567 9081-9149/com.llamaless.gracechruchmk W/System.err:     at com.llamaless.gracechruchmk.RevisedSermonFragment.processParsing(RevisedSermonFragment.kt:127)
2019-12-11 15:30:38.567 9081-9149/com.llamaless.gracechruchmk W/System.err:     at com.llamaless.gracechruchmk.RevisedSermonFragment.parseXML(RevisedSermonFragment.kt:78)
2019-12-11 15:30:38.567 9081-9149/com.llamaless.gracechruchmk W/System.err:     at com.llamaless.gracechruchmk.RevisedSermonFragment.access$parseXML(RevisedSermonFragment.kt:32)
2019-12-11 15:30:38.568 9081-9149/com.llamaless.gracechruchmk W/System.err:     at com.llamaless.gracechruchmk.RevisedSermonFragment$FetchFeedTask.doInBackground(RevisedSermonFragment.kt:147)
2019-12-11 15:30:38.568 9081-9149/com.llamaless.gracechruchmk W/System.err:     at com.llamaless.gracechruchmk.RevisedSermonFragment$FetchFeedTask.doInBackground(RevisedSermonFragment.kt:132)
2019-12-11 15:30:38.568 9081-9149/com.llamaless.gracechruchmk W/System.err:     at android.os.AsyncTask$3.call(AsyncTask.java:378)
2019-12-11 15:30:38.568 9081-9149/com.llamaless.gracechruchmk W/System.err:     at java.util.concurrent.FutureTask.run(FutureTask.java:266)
2019-12-11 15:30:38.568 9081-9149/com.llamaless.gracechruchmk W/System.err:     at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:289)
2019-12-11 15:30:38.568 9081-9149/com.llamaless.gracechruchmk W/System.err:     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
2019-12-11 15:30:38.568 9081-9149/com.llamaless.gracechruchmk W/System.err:     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
2019-12-11 15:30:38.568 9081-9149/com.llamaless.gracechruchmk W/System.err:     at java.lang.Thread.run(Thread.java:919)

Я перепробовал практически все, что мог придумать. В верхней части следующих нескольких уроков, чтобы сделать это. Если это поможет, перед добавлением метода Async я сделал то же самое, читая из папки ресурсов, и это работало отлично. Только когда я переключился на чтение xml динамически, я начал получать сообщения об ошибках.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...