使用 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的XML(DOM)解析问题,指定路径XML如何读取