Синтаксический анализ XML с использованием dom и специальных символов. - PullRequest
3 голосов
/ 27 февраля 2012

Я пытаюсь разобрать xml, содержащий иностранные буквы (особенно), но у меня возникают проблемы с успешным их анализом.Я не получаю никаких ошибок, но буквы разбираются так:Вместо «я получаю», вместо «я получаю» и вместо «я получаю» я также просто заметил символ - не отображается должным образом.Я понимаю, что могу сделать .replaceAll для 3-х букв, но я не уверен, что проблема здесь кроется в том, что я где-то ошибся или просто невозможно без перехода по маршруту replaceAll.Код:

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

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

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

Ответы [ 2 ]

4 голосов
/ 27 февраля 2012

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

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

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

Если у вас есть для использования байтового массива, лучше всего сделать это так:

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

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

0 голосов
/ 27 февраля 2012

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

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

...