3

このLINKから値を解析しようとしていますが、そのxmlエンコーディングは次のようになっています

<?xml version="1.0" encoding="utf-8"?>

get response示されているようにlogcatにメッセージをスローしようとしたとき

11-19 17:25:13.350: W/System.err(3360): This is not valid URL
11-19 17:25:13.350: W/System.err(3360): java.lang.NullPointerException

他のLINKで試したとき、そのエンコーディングは次のようになります

<?xml version="1.0" encoding="UTF-8"?>正常に動作し、値を解析できます。

エンコーディングが UTF-8 ではないために xml の解析が失敗していますか?

これにどう対処すればよいでしょうか。私はグーグルをやったことがありますが、XML解析は初めてです。これは、私が作成しようとしている最初の解析です。道を教えてください。

コードで更新:

public String getXmlFromUrl(String url) {

    String xml = null;

    try {            
        // defaultHttpClient
        HttpClient httpClient = new DefaultHttpClient();
        HttpPost httpPost = new HttpPost(url);           
        HttpResponse httpResponse = httpClient.execute(httpPost);
        HttpEntity httpEntity = httpResponse.getEntity(); 
        xml = EntityUtils.toString(httpEntity);
        System.out.println("response -- " + xml);

    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
    } catch (ClientProtocolException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
    // return XML
    return xml;
}
4

2 に答える 2

3

すぐに、応答の XML のエンコードに問題があるようです。

URL url = new URL("http://myurl.com");
InputSource is = new InputSource(url.openStream());
is.setEncoding("ISO-8859-1"); // Also Try UTF-8 or UTF-16
BufferedReader br = new BufferedReader(new InputStreamReader(is.getByteStream()));
String line,str;
while((line=br.readLine())!=null)
{
      str = str + line;
}
Log.i(TAG,str);
于 2012-11-19T12:30:50.707 に答える
1

応答のコンテンツ タイプヘッダーの文字セットを確認します。ISO-8859-1 または UTF-8 のいずれかです。それに応じてエンコードします。

編集:あなたが提供したリンクについて、応答のエンコーディングを設定しませんでした。あなたは XML 解析に不慣れだと言っていたので、パーサーの実装を投稿しています。

私のパーサー:

public final class SampleParser{


    final static String ROOT_NODE = "Menus";
    final static String ELEMENT_SITEMENU = "SiteMenu";
    final static String ELEMENT_ID = "menuID";
    final static String ELEMENT_TITLE = "menuTitle";
    final static String ELEMENT_CUSTOM = "menuIsCustom";
    final static String ELEMENT_PAGE_URL = "menuCustomPageURL";
    final static String ELEMENT_IOS_ID = "iosMenuID";

    private static final String TAG="SampleParser";

    /**
     * Intentionally commented
     */
    private SampleParser() {}

    /**
     * @param response The XML string which represents the complete news data
     * @return news The complete data
     */
    public static Menus parse(String response) {
        SAXParserFactory spf = SAXParserFactory.newInstance();
        SAXParser sp;
        try {
            sp = spf.newSAXParser();
            XMLReader xr = sp.getXMLReader();
            SampleDataHandler dataHandler = new SampleDataHandler();
            xr.setContentHandler(dataHandler);
            InputSource source = new InputSource(new StringReader(response)); 
            xr.parse(source);
            Menus result = dataHandler.getData();
            return result;
        } catch (ParserConfigurationException e) {
            Log.e(TAG, "parse", e);
        } catch (SAXException e) {
            Log.e(TAG, "parse", e);
        } catch (IOException e) {
            Log.e(TAG, "parse", e);
        } 
        return null;
    }

    static class SampleDataHandler extends DefaultHandler {
        /**
         * 
         */
        private static final String TAG="SampleDataHandler";
        /**
         * 
         */
        private Menus data;
        /**
         * 
         */
        private SiteMenu tempElement;
        /**
         * 
         */
        private boolean readingIosId;
        /**
         * 
         */
        private boolean readingTitle;
        /**
         * 
         */
        private boolean readingID;
        /**
         * 
         */
        private boolean readingCustom;
        /**
         * 
         */
        private boolean readingCustomURL;


        /**
         * 
         */
        public Menus getData(){
            return data;
        }

        /*
         * (non-Javadoc)
         * 
         * @see org.xml.sax.helpers.DefaultHandler#endDocument()
         */
        @Override
        public void endDocument() throws SAXException {
            Log.d(TAG, "endDocument Finished parsing response");
        }

        /*
         * (non-Javadoc)
         * 
         * @see org.xml.sax.helpers.DefaultHandler#endElement(java.lang.String,
         * java.lang.String, java.lang.String)
         */
        @Override
        public void endElement(String uri, String localName, String qName)
                throws SAXException {
            if(qName.equalsIgnoreCase(ELEMENT_SITEMENU)){
                data.addMathematician(tempElement);
            }else if(qName.equalsIgnoreCase(ELEMENT_ID)){
                readingID = false;
            }else if(qName.equalsIgnoreCase(ELEMENT_TITLE)){
                readingTitle = false;
            }else if(qName.equalsIgnoreCase(ELEMENT_IOS_ID)){
                readingIosId = false;
            }else if(qName.equalsIgnoreCase(ELEMENT_CUSTOM)){
                readingCustom = false;
            }else if(qName.equalsIgnoreCase(ELEMENT_PAGE_URL)){
                readingCustomURL = false;
            }
        }

        /*
         * (non-Javadoc)
         * 
         * @see org.xml.sax.helpers.DefaultHandler#startDocument()
         */
        @Override
        public void startDocument() throws SAXException {
            data = new Menus();
            Log.d(TAG, "startDocument Started parsing response");
        }

        /*
         * (non-Javadoc)
         * 
         * @see
         * org.xml.sax.helpers.DefaultHandler#startElement(java.lang.String,
         * java.lang.String, java.lang.String, org.xml.sax.Attributes)
         */
        @Override
        public void startElement(String uri, String localName, String qName,
                Attributes attributes) throws SAXException {
            if(qName.equalsIgnoreCase(ROOT_NODE)){
                //data.setData(new ArrayList<NewsElement>());
            }else if(qName.equalsIgnoreCase(ELEMENT_SITEMENU)){
                tempElement = new SiteMenu();
            }else if(qName.equalsIgnoreCase(ELEMENT_IOS_ID)){
                readingIosId = true;                
            }else if(qName.equalsIgnoreCase(ELEMENT_ID)){
                readingID = true;
            }else if(qName.equalsIgnoreCase(ELEMENT_TITLE)){
                readingTitle = true;
            }else if(qName.equalsIgnoreCase(ELEMENT_CUSTOM)){
                readingCustom = true;
            }else if(qName.equalsIgnoreCase(ELEMENT_PAGE_URL)){
                readingCustomURL = true;
            }
        }

        /*
         * (non-Javadoc)
         * 
         * @see org.xml.sax.helpers.DefaultHandler#characters(char[], int, int)
         */
        @Override
        public void characters(char[] ch, int start, int length)
                throws SAXException {
            String chars = new String(ch, start, length);    
            chars = chars.trim(); 
            if(readingID){
                try{
                    tempElement.setId(Integer.parseInt(chars));
                }catch(Exception e){
                    Log.e(TAG, "characters[Parsing ID]", e);
                    tempElement.setId(-1);
                }
            }
            else if(readingIosId){
                try{
                    tempElement.setiOSID(Integer.parseInt(chars));
                }catch(Exception e){
                    Log.e(TAG, "characters[Parsing iOSID]", e);
                    tempElement.setiOSID(-1);
                }
            }else if(readingTitle){
                tempElement.setTitle(chars);
            }else if(readingCustom){
                try{
                    tempElement.setCustom(Boolean.parseBoolean(chars));
                }catch(Exception e){
                    Log.e(TAG, "characters[Parsing custom]", e);
                    tempElement.setCustom(false);
                }
            }else if(readingCustomURL){
                tempElement.setCustomUrl(chars);
            }
        }
    }
}

ネットワーク呼び出しのための私の utils メソッド。【あなたと同じ】

    /**
     * @param url
     * @return
     */
    private static HttpEntity getResponseEntity(String url) {

        DefaultHttpClient httpClient = getHttpClient();

        HttpGet getMethod = new HttpGet(url);
        long startTime= 0;

        try {
            HttpResponse httpResponse = httpClient.execute(getMethod);

            HttpEntity responseEntity = httpResponse.getEntity();
            return responseEntity;

        } catch (IOException ioe) {
            Log.e(TAG, "getResponseEntity", ioe);
        } catch (Exception e) {
            Log.e(TAG, "getResponseEntity", e);
        } 
        return null;
    }

    /**
     * @param url
     * @return
     */
    public static String getRespAsString(String url) {

        if (!ApplicationInfo.networkStatus) {
            // No Internet Connection
            return null;
        }

        try {
            HttpEntity responseEntity = getResponseEntity(url);
            if (responseEntity != null)
                return EntityUtils.toString(responseEntity);
            else
                return null;
        } catch (Exception e) {
            Log.e(TAG, "getRespAsString", e);
        }

        return null;
    }

応答を取得してパーサーを呼び出すだけです。SampleParser.parse(response);

于 2012-11-19T12:48:13.317 に答える