首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法解析UTF-8 XML

无法解析UTF-8 XML
EN

Stack Overflow用户
提问于 2015-07-11 17:35:17
回答 2查看 935关注 0票数 0

我的外部XML已经有

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>

但是,当我试图在我的应用程序中解析它时,它根本不会读取Unicode!

这是我所做的,但仍然没有运气。

代码语言:javascript
复制
private class MyDownloadTask extends AsyncTask<Void,Void,Void>
{
    String URL = context.getResources().getString(R.string.XML_database_url);
    String KEY_ITEM = "item"; // parent node
    String KEY_NAME = "name";
    String KEY_COST = "location";
    String KEY_DESC = "url";
    ArrayList<RadioListElement> radioArray;

    protected void onPreExecute(final ArrayList<String> userRadios) {
        super.onPreExecute();
        radioArray = new ArrayList<RadioListElement>();
        MainActivity.getDataManager().loadStoredRadioStations(radioArray, userRadios);
    }

    protected Void doInBackground(Void... params) {
        String xml = getXmlFromUrl(URL);
        Document doc = getDomElement(xml);

        NodeList nl = doc.getElementsByTagName(KEY_ITEM);
        for (int i = 0; i < nl.getLength(); i++) {
            Element e = (Element) nl.item(i);
            String name = getValue(e, KEY_NAME);
            String cost = getValue(e, KEY_COST);
            String description = getValue(e, KEY_DESC);
            radioArray.add(new RadioListElement(context, name, cost, description));
        }
        return null;
}

public Document getDomElement(String xml){
        Document doc = null;
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        try {

            DocumentBuilder db = dbf.newDocumentBuilder();

            InputSource is = new InputSource(is,"UTF-8");
            is.setCharacterStream(new StringReader(xml));

            doc = db.parse(is);

        } catch (ParserConfigurationException e) {
            Log.e("Error: ", e.getMessage());
            return null;
        } catch (SAXException e) {
            Log.e("Error: ", e.getMessage());
            return null;
        } catch (IOException e) {
            Log.e("Error: ", e.getMessage());
            return null;
        }
        // return DOM
        return doc;
    }

我把UTF-8放在这里

代码语言:javascript
复制
                InputSource is = new InputSource(is,"UTF-8");

我做错了什么?我怎样才能让它对我来说显示Unicode很好呢?

EN

回答 2

Stack Overflow用户

发布于 2015-07-11 20:33:01

不要试图将xml转换为您自己的字符串,并尝试将字符串提供给dom解析器。xml解析器可以智能地自行解释编码。

我建议将getXmlFromUrl(String url)改为从httpEntity返回InputStream,如下所示:

代码语言:javascript
复制
return httpEntity.getContent()

将此InputStream提供给DOM解析器,如下所示:

代码语言:javascript
复制
InputSource is = new InputSource(inputStream);

请注意,is中未设置任何编码

现在解析此is,并验证它是否按预期解析unicode

票数 1
EN

Stack Overflow用户

发布于 2015-07-11 18:38:49

我将utf-8添加到从url获取xml的代码中。应该如下所示:

xml = EntityUtils.toString(httpEntity,"utf-8");

代码语言:javascript
复制
public String getXmlFromUrl(String url) {
    String xml = null;
    try {
        DefaultHttpClient httpClient = new DefaultHttpClient();
        HttpPost httpPost = new HttpPost(url);

        HttpResponse httpResponse = httpClient.execute(httpPost);
        HttpEntity httpEntity = httpResponse.getEntity();
        xml = EntityUtils.toString(httpEntity,"utf-8");

    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
    } catch (ClientProtocolException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
    return xml;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31355668

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档