【问题标题】:Unable to parse UTF-8 XML无法解析 UTF-8 XML
【发布时间】:2015-07-11 09:35:17
【问题描述】:

我的外部 XML 已经有了

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

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

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

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放在这里

                InputSource is = new InputSource(is,"UTF-8");

我做错了什么?我怎样才能使这项工作正常显示 Unicode?​​p>

【问题讨论】:

  • 你能告诉我们String xml的来源吗?那里可能会出错,因为您还需要使用字符串指定编码。
  • XML 文件是否设置了 Unicode 字节顺序标记?
  • @cvesters xml 没有错,因为将标题放在我提到的内容中是非常标准的。
  • @DerGol...lum 我用 notepad++ 和 UTF-8 不带 BOM 保存它
  • @thevoipman 我仍然缺少“getXmlFromUrl”的实现。另一点是您可以将 XML 作为文件传递给文档构建器。这可能会为您省去很多麻烦。

标签: java android xml unicode utf-8


【解决方案1】:

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

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

return httpEntity.getContent()

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

InputSource is = new InputSource(inputStream);

注意is中没有设置编码

现在解析这个 is 并验证它是否按预期解析 unicode

【讨论】:

    【解决方案2】:

    我将utf-8 添加到从url 获取xml 的代码中。应该是这样的:

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

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

    【讨论】:

      猜你喜欢
      • 2012-11-07
      • 2013-07-14
      • 2017-03-25
      • 2018-11-17
      • 1970-01-01
      • 2017-01-16
      • 2020-01-20
      • 2015-11-18
      • 1970-01-01
      相关资源
      最近更新 更多