使用 DOM 解析 Android XML 布局文件

Posted

技术标签:

【中文标题】使用 DOM 解析 Android XML 布局文件【英文标题】:Using DOM to parse an Android XML layout file 【发布时间】:2011-11-10 17:14:04 【问题描述】:

我刚开始使用 DOM,想解析一个 android XML 布局文件 例如

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_
android:layout_ 
android:padding="30dip">

<LinearLayout
    android:orientation="vertical"
    android:layout_
    android:layout_
    android:layout_gravity="center" >


    <EditText android:id="@+id/entry1" 
        android:layout_ 
        android:layout_ 
        android:background="@android:drawable/editbox_background"/>

    <EditText android:id="@+id/entry2" 
        android:layout_ 
        android:layout_ 
        android:background="@android:drawable/editbox_background"/>


    <EditText android:id="@+id/entry3" 
        android:layout_ 
        android:layout_ 
        android:background="@android:drawable/editbox_background"/>

</LinearLayout>
</LinearLayout>

并得到这样的输出(仅在 EditText 的 ID 上):

ID: @+id/entry1
ID: @+id/entry2
ID: @+id/entry3

有没有办法做到这一点?有人可以指点我一个教程或给我一些想法吗?

当前代码:

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();
        

谢谢!

【问题讨论】:

你想在Android内部还是外部解析布局文件?如果在外部,您更喜欢使用什么平台/语言/等?那里有很多 XML 工具,所以没有必要提供 Java 解决方案,例如,如果您唯一的工具是 Visual Basic... 如果您的平台上有任何 XPath 解释器可用(例如在 Java 中),您可以使用 XPath 表达式轻松地从 XML 中检索所需的数据。 【参考方案1】:

如果您想使用 Java DOM,请尝试这样做

    final String ANDROID_ID = "android:id";

    try 

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

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

        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) 
        e.printStackTrace();
    

可能有更有效的方法可以做到这一点(比如使用 SAX),但它确实有效。

【讨论】:

由于某种原因,当我访问本地驱动器上的 xml 文件时,您的方法有效,但如果我使用 res/layout/page1.xml 路径,它似乎无法找到它并陷入困境堵塞。你知道解决这个问题的方法吗?我已将我的代码添加到我的第一篇文章中。 您不能简单地引用该路径。尝试改用InputStream is = getResources().openRawResource(R.layout.page1); 当我将它放在原始文件夹中时,它可以工作。这样从 xml 页面获取 id 属性不会以二进制形式出现。

以上是关于使用 DOM 解析 Android XML 布局文件的主要内容,如果未能解决你的问题,请参考以下文章

Android之DOM解析XML

Android之DOM解析XML

新手使用android的XML(DOM)解析问题,指定路径XML如何读取

Android Dom和XmlPullParse解析XML文件

Android:怎么解析这段xml

Android -使用DOM(文档对象模型)解析XML文件