Парсинг xml
    
  ![]()  | 
Наши проекты:
 Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту  | 
|
| ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS | 
| [216.73.216.5] | 
 
 | 
		
  | 
    Парсинг xml
    
  | 
         
         
         
          
           Сообщ.
           #1
          
          , 
          
         
         
        
       | 
    |
| 
         | 
      
          Есть xml. Его парсю через андройд апликэйшн. Всё получается, если английский язык. Но если поменять в xml - на русский язык, то при отображении страницы в android api - символы отображаются некорректно. Испробовал поменять кодировку в xml с utf-8 на windows-1251. Не помогло. Пробовал заставить апликацию понимать кодировку - 
        
      InputSource is = new InputSource(); is.setCharacterStream(new StringReader(xml)); is.setEncoding ("windows-1251"); doc = db.parse(is); Ничего не выходит. Может, кто сможет подсказать. Если надо больше исходника - выложу... is.setEncoding("UTF_8"); тоже ничего не выходит Посмотрел в вики http://ru.wikipedia.org/wiki/%D0%9A%D1%80%...%B1%D1%80%D1%8B Сравнил крокозябры. Если мы ставим в xml, который парсим, кодировку 1251, то крокозябры как будто идёт перекодировка из 1251 в 1252. Если мы ставим в xml кодировку utf-8, то крокозябры выглядят, как будто перекодируем из utf в 1252. В чём может быть проблема?  | 
    
| 
         
         
         
          
           Сообщ.
           #2
          
          , 
          
         
         
        
       | 
    |
| 
         | 
      
          А в эксемельке в первой строке есть encoding="UTF-8" ?   
        
       | 
    
| 
         
         
         
          
           Сообщ.
           #3
          
          , 
          
         
         
        
       | 
    |
| 
         | 
      
          конечно( 
        
      Такое ощущение, что на выходе в win1252 каким-то образом перекодирует...(но это только ощущения)  | 
    
| 
         
         
         
          
           Сообщ.
           #4
          
          , 
          
         
         
        
       | 
    |
| 
         | 
      
          muskos, сейчас нет компа по рукой, завтра гляну.   
        
       | 
    
| 
         
         
         
          
           Сообщ.
           #5
          
          , 
          
         
         
        
       | 
    |
| 
         | 
      
          Британский учёныйЗавтра я с ума сойду с этой кодировкой....   
        
       | 
    
| 
         
         
         
          
           Сообщ.
           #6
          
          , 
          
         
         
        
       | 
    |
| 
         | 
      
          Так спроси на стековерфло, там мигом ответят.   
        
       | 
    
| 
         
         
         
          
           Сообщ.
           #7
          
          , 
          
         
         
        
       | 
    |
| 
         | 
      
          ну, языка не хватает) 
        
      спросил на hashcode - молчат(((  | 
    
| 
         
         
         
          
           Сообщ.
           #8
          
          , 
          
         
         
        
       | 
    |
| 
         | 
      
          Британский учёный стековерфло молчит, Хэшкод молчит...   
        
       | 
    
| 
         
         
         
          
           Сообщ.
           #9
          
          , 
          
         
         
        
       | 
    |
| 
         | 
      
| 
         
         
         
          
           Сообщ.
           #10
          
          , 
          
         
         
        
       | 
    |
| 
         | 
      
          Британский учёный Вообщем...мне кажется проблема не на входе, а на выходе... 
        
      Когда я смотрю в вики сравнение на кракозябры почему-то кодировку xml он принимает как надо - utf-8(или когда я менял - windows-1251)...но на выходе получается кракозябры как будто идёт перекодировка в windows-1252... Проверяю не только в эмуляторе, но и в телефоне. Версия android - 2.2. Сегодня попробовал скопипастить другой пример парсинга. Опять же английский парсит, на русский выводит перекодировку в windows-1252 Добавлено Британский учёный Понимаете, в чём дело) Я не особо крут в ява))) принцип понимаю, но что куда - не особо) У меня слегка другой код))) Ща... Добавлено ![]() ![]() import javax.xml.parsers.ParserConfigurationException; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.client.methods.HttpPost; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.util.EntityUtils; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.xml.sax.InputSource; import org.xml.sax.SAXException; public class XMLParser {     public final static Document XMLfromString(String xml){         Document doc = null;         DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();         try {             DocumentBuilder db = dbf.newDocumentBuilder();             InputSource is = new InputSource();             is.setCharacterStream(new StringReader(xml));             doc = db.parse(is);          } catch (ParserConfigurationException e) {             System.out.println("XML parse error: " + e.getMessage());             return null;         } catch (SAXException e) {             System.out.println("Wrong XML file structure: " + e.getMessage());             return null;         } catch (IOException e) {             System.out.println("I/O exeption: " + e.getMessage());             return null;         }         return doc;     }     /** Returns element value       * @param elem element (it is XML tag)       * @return Element value otherwise empty String       */      public final static String getElementValue( Node elem ) {          Node kid;          if( elem != null){              if (elem.hasChildNodes()){                  for( kid = elem.getFirstChild(); kid != null; kid = kid.getNextSibling() ){                      if( kid.getNodeType() == Node.TEXT_NODE  ){                          return kid.getNodeValue();                      }                  }              }          }          return "";      }      public static String getXML(){               String line = null;             try {                 DefaultHttpClient httpClient = new DefaultHttpClient();                 HttpPost httpPost = new HttpPost("http://alfoot.net/newfile.xml");                 HttpResponse httpResponse = httpClient.execute(httpPost);                 HttpEntity httpEntity = httpResponse.getEntity();                 line = EntityUtils.toString(httpEntity);             } catch (UnsupportedEncodingException e) {                 line = "<results status=\"error\"><msg>Can't connect to server</msg></results>";             } catch (MalformedURLException e) {                 line = "<results status=\"error\"><msg>Can't connect to server</msg></results>";             } catch (IOException e) {                 line = "<results status=\"error\"><msg>Can't connect to server</msg></results>";             }             return line;     }     public static int numResults(Document doc){              Node results = doc.getDocumentElement();         int res = -1;         try{             res = Integer.valueOf(results.getAttributes().getNamedItem("count").getNodeValue());         }catch(Exception e ){             res = -1;         }         return res;     }     public static String getValue(Element item, String str) {                NodeList n = item.getElementsByTagName(str);                 return XMLParser.getElementValue(n.item(0));     } } ![]() ![]() package blr.first; import java.util.ArrayList; import java.util.HashMap; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.NodeList; import android.app.ListActivity; import android.os.Bundle; import android.view.View; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.ListAdapter; import android.widget.ListView; import android.widget.SimpleAdapter; import android.widget.Toast; public class PrimierMatchActivity extends ListActivity {     /** Called when the activity is first created. */     @Override     public void onCreate(Bundle savedInstanceState) {         super.onCreate(savedInstanceState);         setContentView(R.layout.listplaceholder);         ArrayList<HashMap<String, String>> mylist = new ArrayList<HashMap<String, String>>();         String xml = XMLParser.getXML();         Document doc = XMLParser.XMLfromString(xml);         int numResults = XMLParser.numResults(doc);         if((numResults <= 0)){             Toast.makeText(PrimierMatchActivity.this, "Geen resultaten gevonden", Toast.LENGTH_LONG).show();               finish();         }         NodeList nodes = doc.getElementsByTagName("result");         for (int i = 0; i < nodes.getLength(); i++) {                                        HashMap<String, String> map = new HashMap<String, String>();                 Element e = (Element)nodes.item(i);             map.put("id", XMLParser.getValue(e, "id"));             map.put("name", "Naam:" + XMLParser.getValue(e, "name"));             map.put("Score", "Score: " + XMLParser.getValue(e, "score"));             mylist.add(map);                     }                ListAdapter adapter = new SimpleAdapter(this, mylist , R.layout.primiermatch,                          new String[] { "name", "Score" },                          new int[] { R.id.item_title, R.id.item_subtitle });         setListAdapter(adapter);         final ListView lv = getListView();         lv.setTextFilterEnabled(true);           lv.setOnItemClickListener(new OnItemClickListener() {             public void onItemClick(AdapterView<?> parent, View view, int position, long id) {                               @SuppressWarnings("unchecked")                 HashMap<String, String> o = (HashMap<String, String>) lv.getItemAtPosition(position);                                    Toast.makeText(PrimierMatchActivity.this, "ID '" + o.get("id") + "' was clicked.", Toast.LENGTH_LONG).show();              }         });     } } вот два моих файлика...если можно, покажите куда копипастить)) Добавлено Кажется нашёл, но всё же, пока тестю, если сможите - отпишите) может не то нашёл)  | 
    
| 
         
         
         
          
           Сообщ.
           #11
          
          , 
          
         
         
        
       | 
    |
| 
         | 
      
          muskos, тести бо я у компа буду часа через 2   
        
       | 
    
| 
         
         
         
          
           Сообщ.
           #12
          
          , 
          
         
         
        
       | 
    |
| 
         | 
      
         Цитата muskos @  public class XMLParser { public final static Document XMLfromString(String xml){ Document doc = null; DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); try { DocumentBuilder db = dbf.newDocumentBuilder(); InputSource is = new InputSource(); is.setCharacterStream(new StringReader(xml)); doc = db.parse(is); } catch (ParserConfigurationException e) { System.out.println("XML parse error: " + e.getMessage()); return null; } catch (SAXException e) { System.out.println("Wrong XML file structure: " + e.getMessage()); return null; } catch (IOException e) { System.out.println("I/O exeption: " + e.getMessage()); return null; } return doc; } Вот это не надо делать, достаточно воспользоваться методом public Document parse(String uri)  | 
    
| 
         
         
         
          
           Сообщ.
           #13
          
          , 
          
         
         
        
       | 
    |
| 
         | 
      
          mrco Эм...я ноль))) Ну, спасибо, почитаю, может просветит)   
        
       | 
    
| 
         
         
         
          
           Сообщ.
           #14
          
          , 
          
         
         
        
       | 
    |
| 
         | 
      
          Не, я ошибся. Это сосвем не то что нужно.   
        
       | 
    
| 
         
         
         
          
           Сообщ.
           #15
          
          , 
          
         
         
        
       | 
    |
| 
         | 
      
          хух)) расслабил) 
        
      на стековерфло всё пытаются на шрифт давить и кодировку....думаю проблема не в этом..  | 
    
| 
         
         
         
          
           Сообщ.
           #16
          
          , 
          
         
         
        
       | 
    |
| 
         | 
      
          В общем-то: 
        
      ![]() ![]() InputSource is = new InputSource(); is.setCharacterStream(new StringReader(xml)); doc = db.parse(is); должно работать. без каких либо указаний кодировок, потому что на входе у вас String. А он бывает только в одной кодировке. 1. Проверьте что у вас в строке на входе в метод XMLfromString, если она битая, то дальше ничего уже не исправить. 2. У вас Response от сервера сначала перегоняеться в строку, а потом из строки в xml документ. Это лишние действия: ![]() ![]()         final HttpResponse response = mHttpClient.execute(request);     final InputStream in = response.getEntity().getContent();     DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();     factory.setNamespaceAware(true); // never forget this!     DocumentBuilder builder = factory.newDocumentBuilder();     Document doc = builder.parse(in); этот фрагмент гарантированно работает с UTf-8.  | 
    
| 
         
         
         
          
           Сообщ.
           #17
          
          , 
          
         
         
        
       | 
    |
| 
         | 
      
          Британский учёный 
        
      ![]() ![]() public class XMLParser {     public final static Document XMLfromString(String xml){         Document doc = null;         //DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();         //DocumentBuilder builder = dbf.newDocumentBuilder();         try {             DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();             DocumentBuilder builder = dbf.newDocumentBuilder();             DocumentBuilder db = dbf.newDocumentBuilder();             //StringReader sr = new StringReader(xml);              //InputSource is = new InputSource(sr);             //is.setCharacterStream(new StringReader(xml));             //is.setEncoding("utf-8");             ByteArrayInputStream encXML = new ByteArrayInputStream(xml.getBytes("UTF8"));             doc = builder.parse(encXML);          } catch (ParserConfigurationException e) {             System.out.println("XML parse error: " + e.getMessage());             return null;         } catch (SAXException e) {             System.out.println("Wrong XML file structure: " + e.getMessage());             return null;         } catch (IOException e) {             System.out.println("I/O exeption: " + e.getMessage());             return null;         }         return doc;     } методом тыка испробовал много вариантов...всё равно кодировку не меняет( Добавлено mrco знаний не хватает - проверить что в строке на входе((( Добавлено mrco Я слегка не понимаю про Response... У меня всё тоже самое, кроме одной строчки, только раскидано между функциями... ![]() ![]() public class XMLParser {     public final static Document XMLfromString(String xml){         Document doc = null;         DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();         dbf.setNamespaceAware(true); // never forget this!         try {             DocumentBuilder db = dbf.newDocumentBuilder();             InputSource is = new InputSource();             is.setCharacterStream(new StringReader(xml));             doc = db.parse(is);          } catch (ParserConfigurationException e) {             System.out.println("XML parse error: " + e.getMessage());             return null;         } catch (SAXException e) {             System.out.println("Wrong XML file structure: " + e.getMessage());             return null;         } catch (IOException e) {             System.out.println("I/O exeption: " + e.getMessage());             return null;         }         return doc;     }     /** Returns element value       * @param elem element (it is XML tag)       * @return Element value otherwise empty String       */      public final static String getElementValue( Node elem ) {          Node kid;          if( elem != null){              if (elem.hasChildNodes()){                  for( kid = elem.getFirstChild(); kid != null; kid = kid.getNextSibling() ){                      if( kid.getNodeType() == Node.TEXT_NODE  ){                          return kid.getNodeValue();                      }                  }              }          }          return "";      }      public static String getXML(){               String line = null;             try {                 DefaultHttpClient httpClient = new DefaultHttpClient();                 HttpPost httpPost = new HttpPost("http://alfoot.net/newfile.xml");                 HttpResponse httpResponse = httpClient.execute(httpPost);                 InputStream in = httpResponse.getEntity().getContent();//                 HttpEntity httpEntity = httpResponse.getEntity();                 line = EntityUtils.toString(httpEntity);             } catch (UnsupportedEncodingException e) {                 line = "<results status=\"error\"><msg>Can't connect to server</msg></results>";             } catch (MalformedURLException e) {                 line = "<results status=\"error\"><msg>Can't connect to server</msg></results>";             } catch (IOException e) {                 line = "<results status=\"error\"><msg>Can't connect to server</msg></results>";             }             return line;     }     // final HttpResponse response = mHttpClient.execute(request);      //   final InputStream in = response.getEntity().getContent();     public static int numResults(Document doc){              Node results = doc.getDocumentElement();         int res = -1;         try{             res = Integer.valueOf(results.getAttributes().getNamedItem("count").getNodeValue());         }catch(Exception e ){             res = -1;         }         return res;     }     public static String getValue(Element item, String str) {                NodeList n = item.getElementsByTagName(str);                 return XMLParser.getElementValue(n.item(0));     } }  | 
    
| 
         
         
         
          
           Сообщ.
           #18
          
          , 
          
         
         
        
       | 
    |
| 
         | 
      
          Самое обидное...то, что уже столько получилось копипастом...и на одной фишке легло(((  
        
      Добавлено Это переменная doc 03-28 13:58:07.523: I/System.out(305): !: org.apache.harmony.xml.dom.DocumentImpl@44f69f88 Переменная line в месте где должны быть наши буковки русские...уже хранит абракадабру - 03-28 13:59:44.493: I/System.out(333): <name>Ðоманда Ð - Ðоманда Ð</name> mrco, вы имели в виду этот вход? Или есть ещё где?  | 
    
| 
         
         
         
          
           Сообщ.
           #19
          
          , 
          
         
         
        
       | 
    |
| 
         | 
      
         Цитата muskos @  Переменная line в месте где должны быть наши буковки русские...уже хранит абракадабру -  Тоесть ПЕРЕД парсингом уже фигня в строке? Тогда парсер не причёмю  | 
    
| 
         
         
         
          
           Сообщ.
           #20
          
          , 
          
         
         
        
       | 
    |
| 
         | 
      
          На всякий случай покажу, где переменная line лежит...и в какой момент она что делает... 
        
      ![]() ![]() public static String getXML(){                String line = null;             try {                 DefaultHttpClient httpClient = new DefaultHttpClient();                 HttpPost httpPost = new HttpPost("http://alfoot.net/newfile.xml");                 HttpResponse httpResponse = httpClient.execute(httpPost);                 HttpEntity httpEntity = httpResponse.getEntity();                 line = EntityUtils.toString(httpEntity);             } catch (UnsupportedEncodingException e) {                 line = "<results status=\"error\"><msg>Can't connect to server</msg></results>";             } catch (MalformedURLException e) {                 line = "<results status=\"error\"><msg>Can't connect to server</msg></results>";             } catch (IOException e) {                 line = "<results status=\"error\"><msg>Can't connect to server</msg></results>";             }             return line;     } Хорошо, тогда ЧТО ЖЕ ЭТО МОЖЕТ БЫТЬ((( У МЕНЯ УЖЕ ГОЛОВА КРУГОМ))))     | 
    
| 
         
         
         
          
           Сообщ.
           #21
          
          , 
          
         
         
        
       | 
    |
| 
         | 
      
          С сервера xml приходит в какой кодировке? 
        
      Если utf-8 то попробуйте line = EntityUtils.toString(httpEntity, "UTF-8");  | 
    
| 
         
         
         
          
           Сообщ.
           #22
          
          , 
          
         
         
        
       | 
    |
| 
         | 
      
          mrco Я ПРОСТО В ШОКЕ!!!!!!!!!! СПАСИБО БОЛЬШОЕ!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!   
        
       |