2015-08-16 5 views
0

Я пытаюсь разобрать XML-файл, который я получаю, введя URL-адрес этого XML-файла в качестве параметра в моей функции doInBackground. Теперь я вызываю эту функцию 2 раза.Ошибка анализа XML-XML

Во время первого звонка он работает нормально.

Во время второго называют это дает мне ошибку синтаксического анализа:

08-16 23:49:20.823 27735-28009/be.project.randomreader W/System.err﹕ org.xml.sax.SAXParseException: Unexpected token (position:TEXT {"success":{"[email protected]:210 in [email protected])

Есть ли у него что-то делать с «?» знак и знак «=» в моем URL-адресе?

Как я могу изменить свой код для решения этой проблемы?

//first call: 
    ArrayList<String> url= new ArrayList<String>(); 
     url.add("http://api.theysaidso.com/qod.xml"); 
     url.add(""); 
     new DownloadXML().execute(url); 

    //second call after a click event: 
    ArrayList<String> url= new ArrayList<String>(); 
    url.add("http://api.theysaidso.com/"); 
    url.add("qod?category=" + random); 
    new DownloadXML().execute(url); 

    private class DownloadXML extends AsyncTask<ArrayList<String>,Void,ArrayList> { 

    @Override 
    protected ArrayList doInBackground(ArrayList<String>... url) { 

     try { 

      ArrayList<String> urlLijst = url[0]; 
      String query = URLEncoder.encode(urlLijst.get(1), "utf-8"); 
      String url1 = urlLijst.get(0) + query; 

      URL url2 = new URL(url1); //.toString() 
      URLConnection conn = url2.openConnection(); 

      DocumentBuilderFactory factory = documentBuilderFactor.get(); 
      DocumentBuilder parser = factory.newDocumentBuilder(); 
      Document doc = parser.parse(conn.getInputStream()); 
      parser.reset(); 

      NodeList nodes = doc.getElementsByTagName("quotes"); 
      for (int i = 0; i < nodes.getLength(); i++) { 
       Element element = (Element) nodes.item(i); 
       NodeList title = element.getElementsByTagName("quote"); 
       Element quote = (Element) title.item(0); 
       lijstQuotes.add(quote.getTextContent()); 
      } 

      for (int i = 0; i < nodes.getLength(); i++) { 
       Element element = (Element) nodes.item(i); 
       NodeList title = element.getElementsByTagName("author"); 
       Element author = (Element) title.item(0); 
       lijstQuotes.add(author.getTextContent()); 
      } 
     } 
} 
} 
+0

показать данные XML, которые вы разобрали –

+0

Укажите, пожалуйста, полный URL-адрес, который вы пытаетесь использовать. Поскольку это разные URL-адреса, вы используете –

+0

http://api.theysaidso.com/qod.xml: РАБОТЫ http://api.theysaidso.com/qod?category=management: DOESNT WORK – MrSpokes

ответ

1

Изменить второй вызов из

url.add("http://api.theysaidso.com/"); 
url.add("qod?category=" + random); 

в

url.add("http://api.theysaidso.com/qod.xml?category=" + random); 

API-интерфейс theysaidso, похоже, меняет свою кодировку на основе запрошенных заголовков или запросов в явном формате. Добавляя .xml, вы форсируете формат xml. В другом случае вы возвращаете ответ json и парсер терпит неудачу. Дополнительная информация здесь https://theysaidso.com/api

0

В первом называют свой

url[0] = "http://api.theysaidso.com/qod.xml" 

Во второй раз:

"http://api.theysaidso.com/" 

Таким образом, вы не получите XML во второй раз.

Попробуйте изменить

url.add("http://api.theysaidso.com/"); 
url.add("qod?category=" + random); 

в

url.add("http://api.theysaidso.com/qod?category=" + random); 
url.add(""); 
+0

Он все равно дает мне ошибку синтаксического анализа. Сначала я разделил эту ссылку, чтобы попытаться избежать ошибки, хотя ... без успеха. – MrSpokes

+0

Вы можете узнать, что в вашем url1, url2 и conn.getInputStream() только во время отладки каждый раз – VCHe

+0

второй звонок он дает мне это: http://api.theysaidso.com/qod%3Fcategory%3Dinspire для url1 и url2, поэтому функция кодирования, похоже, выполнила свою работу. Странно, что разбор не работает – MrSpokes

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