Как правильно использовать DOM для чтения XML в приложениях Android?

Я могу получить нужную мне информацию, если XML-файл хранится локально на моей машине, но чтение его при сохранении на телефоне работает не очень хорошо.

Я пробовал XMLPullParser, но он извлекает двоичную информацию об именах идентификаторов и т. д., и мне нужно фактическое имя.

Код:

    final String ANDROID_ID = "android:id";

            try {
                File fXmlFile = new File("res/layout/page1.xml");
                DocumentBuilderFactory dbFactory = DocumentBuilderFactory
                        .newInstance();
                DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
                Document doc = dBuilder.parse(fXmlFile);
                doc.getDocumentElement().normalize();

                NodeList nList = doc.getElementsByTagName("Button");

                for (int temp = 0; temp < nList.getLength(); temp++) {
                    Node nNode = nList.item(temp);
                    if (nNode.getNodeType() == Node.ELEMENT_NODE) {
                        Element eElement = (Element) nNode;

                        if (eElement.hasAttribute(ANDROID_ID))
                            System.out.println("ID: "
                                    + eElement.getAttribute(ANDROID_ID));
                    }
                }
            } 

            catch (Exception e) {
                System.out.println("Catch");


  e.printStackTrace();
        }

person Neeta    schedule 20.11.2011    source источник


Ответы (2)


в документации XmlPullParser есть getAttributeCount() и getAttributeByName(int index), которые могут быть полезны. Вы должны использовать его в START_TAG

person Jordi Coscolla    schedule 20.11.2011
comment
Пробовал использовать предложенные вами методы. Однако значение id отображается как число, хотя я надеялся, что оно будет похоже на «@+id/page1». Я отредактировал свой первый пост с моим новым кодом и выводом. - person Neeta; 20.11.2011
comment
Вероятно, это связано с тем, что это двоичный XML-файл, а это означает, что он был предварительно скомпилирован для повышения эффективности. Я думаю, вы хотите вместо этого прочитать простой XML. - person dmon; 20.11.2011
comment
Это будет сложнее, так как вам нужно будет создать свой собственный XmlPullParser, но вы, вероятно, сможете получить необработанный xml InputStream, используя res.openRawResource(R.layout.the_id). - person dmon; 20.11.2011
comment
@dmon Ранее я написал другой метод, который использовал DOM для чтения файла XML, но он не смог получить ресурс XML (хотя мог бы, если бы он хранился локально на моей машине). Я думаю, это может быть связано с неправильной ссылкой на ресурс или код? Я отредактировал приведенный выше код с помощью этого другого метода DOM. - person Neeta; 20.11.2011
comment
Я никогда этого не делал, так что это была просто догадка. Вместо того, чтобы ссылаться на файл таким образом, попробуйте использовать метод res.openRawResource(), который я предложил, и передайте этот InputStream в метод DocumentBuilder. - person dmon; 20.11.2011
comment
@dmon Метод openRawResource работает, если я помещаю файл xml в папку res/raw. Таким образом, идентификаторы не выводятся в двоичном виде. - person Neeta; 24.11.2011
comment
Да, это тоже подойдет. Плохо только то, что приходится дублировать файлы :( . - person dmon; 24.11.2011

Эта ссылка анализирует XML хорошо. Здесь вы можете найти и другие парсеры с xmlPullParser.

person Vineet Shukla    schedule 20.11.2011