Версия для печати
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум на Исходниках.RU > Android > Парсинг xml


Автор: muskos 27.03.12, 18:39
Есть 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. В чём может быть проблема?

Автор: Британский учёный 27.03.12, 19:07
А в эксемельке в первой строке есть encoding="UTF-8" ?

Автор: muskos 27.03.12, 19:08
конечно(

Такое ощущение, что на выходе в win1252 каким-то образом перекодирует...(но это только ощущения)

Автор: Британский учёный 27.03.12, 19:09
muskos, сейчас нет компа по рукой, завтра гляну.

Автор: muskos 27.03.12, 19:22
Британский учёныйЗавтра я с ума сойду с этой кодировкой....

Автор: Британский учёный 27.03.12, 19:25
Так спроси на стековерфло, там мигом ответят.

Автор: muskos 27.03.12, 19:45
ну, языка не хватает)
спросил на hashcode - молчат(((

Автор: muskos 28.03.12, 06:24
Британский учёный стековерфло молчит, Хэшкод молчит...

Автор: Британский учёный 28.03.12, 06:44
А так не взлетит?

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

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

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

Добавлено
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    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));
        }
    }


<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    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();
     
                }
            });
        }
    }


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

Добавлено
Кажется нашёл, но всё же, пока тестю, если сможите - отпишите) может не то нашёл)

Автор: Британский учёный 28.03.12, 07:06
muskos, тести бо я у компа буду часа через 2

Автор: mrco 28.03.12, 09: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)

Автор: muskos 28.03.12, 09:25
mrco Эм...я ноль))) Ну, спасибо, почитаю, может просветит)

Автор: mrco 28.03.12, 10:43
Не, я ошибся. Это сосвем не то что нужно.

Автор: muskos 28.03.12, 10:56
хух)) расслабил)
на стековерфло всё пытаются на шрифт давить и кодировку....думаю проблема не в этом..

Автор: mrco 28.03.12, 10:56
В общем-то:
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    InputSource is = new InputSource();
    is.setCharacterStream(new StringReader(xml));
    doc = db.parse(is);

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

Автор: muskos 28.03.12, 11:10
Британский учёный
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    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... У меня всё тоже самое, кроме одной строчки, только раскидано между функциями...

<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    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));
        }
    }

Автор: muskos 28.03.12, 13:33
Самое обидное...то, что уже столько получилось копипастом...и на одной фишке легло(((

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

Автор: Британский учёный 28.03.12, 14:12
Цитата muskos @
Переменная line в месте где должны быть наши буковки русские...уже хранит абракадабру -

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

Автор: muskos 28.03.12, 14:14
На всякий случай покажу, где переменная line лежит...и в какой момент она что делает...

<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    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:

Автор: mrco 28.03.12, 15:04
С сервера xml приходит в какой кодировке?
Если utf-8 то попробуйте line = EntityUtils.toString(httpEntity, "UTF-8");

Автор: muskos 28.03.12, 16:25
mrco Я ПРОСТО В ШОКЕ!!!!!!!!!! СПАСИБО БОЛЬШОЕ!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

Powered by Invision Power Board (https://www.invisionboard.com)
© Invision Power Services (https://www.invisionpower.com)