2012-02-27 3 views
3

Я пытаюсь разобрать xml, содержащий иностранные буквы (особенно,), однако у меня возникают проблемы с успешным их синтаксическим анализом. Я не получаю никаких ошибок, но буквы анализируются как это; Вместо æ im get Ã| вместо å im get à ¥, а вместо ø im получения ø Я также заметил, что символ - отображается неправильно. Я понимаю, что я мог бы сделать. ReplaceAll для 3 букв, но я не уверен, что проблема здесь сводится к тому, что я где-то ошибаюсь, или если это просто невозможно, не спускаясь по пути replaceAll.XML-синтаксический анализ с dom и специальными символами

Код:

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

      DocumentBuilder db = dbf.newDocumentBuilder(); 

      InputSource is = new InputSource(new ByteArrayInputStream(
        xml.getBytes())); 
      // is.setCharacterStream(new StringReader(xml)); 
      is.setEncoding("UTF-8"); 
      Log.i(TAG, "Encoding: " + is.getEncoding()); 
      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; 
    } 

    private String getValue(Element item, String str) { 
     NodeList n = item.getElementsByTagName(str); 
     return this.getElementValue(n.item(0)); 
    } 

    private final String getElementValue(Node elem) { 
     Node child; 
     if (elem != null) { 
      if (elem.hasChildNodes()) { 
       for (child = elem.getFirstChild(); child != null; child = child 
         .getNextSibling()) { 
        if (child.getNodeType() == Node.TEXT_NODE) { 
         return child.getNodeValue(); 
        } 
       } 
      } 
     } 
     return ""; 
    } 
} 

Позвольте мне знать, если вам нужно, чтобы увидеть больше кода, чем это.

Оцените любые предложения - Спасибо.

ответ

4

Проблема в том, что вы преобразовываете аргумент String в байты, используя getBytes(). Вы бы лучше не преобразовывать в байты на всех:

InputSource is = new InputSource(new StringReader(xml)); 

Я вижу, что вы, что закомментированы в коде. Есть ли причина, по которой вы не хотите ее использовать?

Если есть использовать массив байтов, то лучше сделать это следующим образом:

InputSource is = new InputSource(new ByteArrayInputStream(
    xml.getBytes("UTF-8"))); 

На старых версиях Android, кодировка по умолчанию зависит от локали.

+0

Спасибо за ваши предложения. Следуя вашим предложениям, я пробовал следующее: InputSource is = new InputeSource (новый ByteArrayInpuStream (xml.getBytes («UTF-8»))); и InputSource = новый InputSource (новый StringReader (xml)); Ни один из этих подходов не имел никакого значения. The is.setCharacterStream - это попытка решить эту проблему, но, похоже, она не имеет никакого значения. – Line

+0

@Line - Возможно, кодировка была испорчена, когда сначала была создана xml String (до вызова 'getDomElement'). Возможно, убедитесь, что на входной строке действительно есть символы, которые вы ожидаете. –

+1

Пример xml, который я пытаюсь проанализировать, находится здесь: HttpResponse loginResponse = loginClient.execute (loginPost); HttpEntity responseEnt = loginResponse.getEntity(); Строковый результат = EntityUtils.toString (responseEnt); // Это строка, переданная синтаксическому анализатору. Может ли проблема EnitityUtils.toString() вызывать проблемы? Я, однако, могу использовать xml, который я разбираю, чтобы проверить, что другая информация обрабатывается на телефоне с API веб-сайта. – Line

0

Что вы делаете, предполагается, что кодировка по умолчанию для платформ - «UTF-8»; Я думаю, на самом деле это может быть «UTF-16».

Попробуйте передать одно и то же имя кодировки в xml.getBytes(), как вы это делаете, is.setEncoding().

+0

Согласно [docs] (http://developer.android.com/reference/java/nio/charset/Charset.html): «На Android по умолчанию используется кодировка UTF-8."(В старых версиях Android значение по умолчанию зависело от локали, но я не считаю, что это когда-либо UTF-16.) –

Смежные вопросы