На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: Hsilgos
  
> Парсинг xml
    Есть 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. В чём может быть проблема?
      А в эксемельке в первой строке есть encoding="UTF-8" ?
        конечно(

        Такое ощущение, что на выходе в win1252 каким-то образом перекодирует...(но это только ощущения)
          muskos, сейчас нет компа по рукой, завтра гляну.
            Британский учёныйЗавтра я с ума сойду с этой кодировкой....
              Так спроси на стековерфло, там мигом ответят.
                ну, языка не хватает)
                спросил на hashcode - молчат(((
                  Британский учёный стековерфло молчит, Хэшкод молчит...
                      Британский учёный Вообщем...мне кажется проблема не на входе, а на выходе...
                      Когда я смотрю в вики сравнение на кракозябры почему-то кодировку xml он принимает как надо - utf-8(или когда я менял - windows-1251)...но на выходе получается кракозябры как будто идёт перекодировка в windows-1252...
                      Проверяю не только в эмуляторе, но и в телефоне.
                      Версия android - 2.2.

                      Сегодня попробовал скопипастить другой пример парсинга. Опять же английский парсит, на русский выводит перекодировку в windows-1252

                      Добавлено
                      Британский учёный Понимаете, в чём дело) Я не особо крут в ява))) принцип понимаю, но что куда - не особо) У меня слегка другой код)))
                      Ща...

                      Добавлено
                      ExpandedWrap disabled
                        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));
                            }
                        }


                      ExpandedWrap disabled
                        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();
                         
                                    }
                                });
                            }
                        }


                      вот два моих файлика...если можно, покажите куда копипастить))

                      Добавлено
                      Кажется нашёл, но всё же, пока тестю, если сможите - отпишите) может не то нашёл)
                        muskos, тести бо я у компа буду часа через 2
                          Цитата 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)
                            mrco Эм...я ноль))) Ну, спасибо, почитаю, может просветит)
                              Не, я ошибся. Это сосвем не то что нужно.
                                хух)) расслабил)
                                на стековерфло всё пытаются на шрифт давить и кодировку....думаю проблема не в этом..
                                  В общем-то:
                                  ExpandedWrap disabled
                                    InputSource is = new InputSource();
                                    is.setCharacterStream(new StringReader(xml));
                                    doc = db.parse(is);

                                  должно работать. без каких либо указаний кодировок, потому что на входе у вас String. А он бывает только в одной кодировке.
                                  1. Проверьте что у вас в строке на входе в метод XMLfromString, если она битая, то дальше ничего уже не исправить.
                                  2. У вас Response от сервера сначала перегоняеться в строку, а потом из строки в xml документ. Это лишние действия:
                                  ExpandedWrap disabled
                                            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.
                                    Британский учёный
                                    ExpandedWrap disabled
                                      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... У меня всё тоже самое, кроме одной строчки, только раскидано между функциями...

                                    ExpandedWrap disabled
                                      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));
                                          }
                                      }
                                      Самое обидное...то, что уже столько получилось копипастом...и на одной фишке легло(((

                                      Добавлено
                                      Это переменная 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, вы имели в виду этот вход? Или есть ещё где?
                                        Цитата muskos @
                                        Переменная line в месте где должны быть наши буковки русские...уже хранит абракадабру -

                                        Тоесть ПЕРЕД парсингом уже фигня в строке? Тогда парсер не причёмю
                                          На всякий случай покажу, где переменная line лежит...и в какой момент она что делает...

                                          ExpandedWrap disabled
                                            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;
                                             
                                                }


                                          Хорошо, тогда ЧТО ЖЕ ЭТО МОЖЕТ БЫТЬ((( У МЕНЯ УЖЕ ГОЛОВА КРУГОМ)))) :crazy:
                                            С сервера xml приходит в какой кодировке?
                                            Если utf-8 то попробуйте line = EntityUtils.toString(httpEntity, "UTF-8");
                                              mrco Я ПРОСТО В ШОКЕ!!!!!!!!!! СПАСИБО БОЛЬШОЕ!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
                                              0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                              0 пользователей:


                                              Рейтинг@Mail.ru
                                              [ Script execution time: 0,0934 ]   [ 16 queries used ]   [ Generated: 18.04.24, 05:03 GMT ]