XmlResourceParser类是怎么样解析XML文件的

本文通过实例展示了如何在Android应用中解析XML文件,并详细解释了XMLResourceParser类的使用方法,包括如何读取XML内容并将其显示在EditText控件上。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

android开发过程会经常使用XML文件,下面提供小实例,看看XmlResourceParser类是怎么样解析XML文件的。

XML文件名称为test.xml。内容如下:

 

Xml代码   收藏代码
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <resources>  
  3.     <customer name="luopeng"  age="21"  gender="1" emial="dylankeepmoving@163.com"/>  
  4.     <customer name="dylan"  age="22"  gender="2"  emial="710097663@qq.com"/>  
  5.     <customer name="android"  age="6"  gender="2"  emial="android@gmail.com"/>  
  6. </resources>  

布局文件main.xml内容如下:

 

 

 

Xml代码   收藏代码
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:layout_width="fill_parent"  
  4.     android:layout_height="fill_parent"  
  5.     android:orientation="vertical" >  
  6.   
  7.     <TextView  
  8.         android:id="@+id/textview01"  
  9.         android:layout_width="fill_parent"  
  10.         android:layout_height="wrap_content"  
  11.         android:text="@string/hello" />  
  12.     <Button   
  13.         android:id="@+id/btn01"  
  14.         android:layout_width="wrap_content"  
  15.         android:layout_height="wrap_content"  
  16.         android:text="@string/btn01"  
  17.         />  
  18.     <EditText   
  19.         android:id="@+id/edittext01"  
  20.         android:layout_width="wrap_content"  
  21.         android:layout_height="wrap_content"  
  22.         android:text="@string/eidttext01"  
  23.         />  
  24. </LinearLayout>  
  

 

 如下则是具体解析XML文件的类TestXmlResourceParserActivity.java:

 

 

Java代码   收藏代码
  1. package com.dylan.xmlresourceparser;  
  2.   
  3. import java.io.IOException;  
  4.   
  5. import org.xmlpull.v1.XmlPullParserException;  
  6.   
  7. import android.app.Activity;  
  8. import android.content.res.Resources;  
  9. import android.content.res.XmlResourceParser;  
  10. import android.os.Bundle;  
  11. import android.view.View;  
  12. import android.view.View.OnClickListener;  
  13. import android.widget.Button;  
  14. import android.widget.EditText;  
  15.   
  16. /* 
  17.  * 此类的作用是点击按钮后在EditView上显示资源文件(一个XML)中的内容 
  18.  * 此例中会使用到XMLResourceParser 
  19.  */  
  20. public class TestXmlResourceParserActivity extends Activity {  
  21.     /** Called when the activity is first created. */  
  22.     private EditText et;  
  23.     private Button myButton;  
  24.   
  25.     @Override  
  26.     public void onCreate(Bundle savedInstanceState) {  
  27.         super.onCreate(savedInstanceState);  
  28.         setContentView(R.layout.main);  
  29.   
  30.         // 变量在内部类中使用的前提是此变量必须是final修饰的  
  31.         myButton = (Button) this.findViewById(R.id.btn01);  
  32.         et = (EditText) this.findViewById(R.id.edittext01);  
  33.         myButton.setOnClickListener(new OnClickListener() {  
  34.             StringBuilder sb = new StringBuilder("");  
  35.             Resources res = getResources();  
  36.             XmlResourceParser xrp = res.getXml(R.xml.test);  
  37.   
  38.             @Override  
  39.             public void onClick(View v) {  
  40.                 int counter = 0;  
  41.                 try {  
  42.                     // 判断是否到了文件的结尾  
  43.                     while (xrp.getEventType() != XmlResourceParser.END_DOCUMENT) {  
  44.                         //文件的内容的起始标签开始,注意这里的起始标签是test.xml文件里面<resources>标签下面的第一个标签  
  45.                         if (xrp.getEventType() == XmlResourceParser.START_TAG) {  
  46.                             String tagname = xrp.getName();  
  47.                             if (tagname.endsWith("customer")) {  
  48.                                 counter++;  
  49.                                 sb.append("这是第" + counter + "客户"+"\n");  
  50.                                 sb.append("姓名:"+xrp.getAttributeValue(0)+"\n");  
  51.                                 sb.append("年龄:"+xrp.getAttributeValue(1)+"\n");  
  52.                                 sb.append("性别:"+xrp.getAttributeValue(2)+"\n");  
  53.                                 sb.append("邮箱:"+xrp.getAttributeValue(3)+"\n\n");  
  54.                             }  
  55.                         }  
  56.                         // 下面的两个else if什么作用呢?  
  57.                         else if (xrp.getEventType() == XmlResourceParser.END_TAG) {  
  58.                         } else if (xrp.getEventType() == XmlResourceParser.TEXT) {  
  59.                         }   
  60.                         xrp.next();  
  61.                     }  
  62.                     //程序细节注意的地方,StringBuilder要条用toString()方法,不要粗心忘记了  
  63.                     et.setText(sb.toString());  
  64.                 } catch (XmlPullParserException e) {  
  65.   
  66.                 } catch (IOException e) {  
  67.                     e.printStackTrace();  
  68.                 }  
  69.             }  
  70.         });  
  71.     }  
  72. }  

  运行结果如下图:



转载自:http://www.iteye.com/topic/1122056

<think>我们正在寻找Android框架中负责解析XML配置文件的具体代码位置。根据Android系统的架构,XML解析通常涉及到底层的解析器和框架中处理资源、布局等的代码。在Android中,XML解析广泛用于布局文件(如activity_main.xml)、清单文件(AndroidManifest.xml)以及资源文件(如strings.xml)等。解析这些XML文件的核心代码位于Android框架的多个部分,但主要涉及以下几个关键组件:1.**XmlPullParser**:Android推荐使用XmlPullParser来解析XML,这是一种基于事件驱动的解析方式。其实现位于`frameworks/base/core/java/org/xmlpull/v1/`目录下。但是,Android实际使用的是其内置的实现(如ExpatPullParser或KXmlParser),而不是引用外部解析器。2.**资源解析**:当解析资源文件(如res目录下的XML文件)时,代码位于资源框架中。主要包括:-`AssetManager`:负责访问资源。-`Resources`:提供访问资源的接口。-`ResourceTable`:内部用于解析资源表。-具体解析资源XML的代码在`Resources`中,但实际解析工作由`XmlBlock`和`XmlResourceParser`处理。3.**布局解析**:布局文件由`LayoutInflater`处理,它使用`XmlResourceParser`来解析布局文件。`LayoutInflater`位于`frameworks/base/core/java/android/view/`目录下。4.**AndroidManifest.xml解析**:这个文件在应用安装时由`PackageManagerService`解析。相关代码位于`frameworks/base/services/core/java/com/android/server/pm/`目录下,特别是`PackageParser.java`(在较新版本中可能被重构,但功能似)。5.**系统配置文件解析**:例如,系统权限文件(如`/system/etc/permissions`下的文件)由`SystemConfig`解析,该位于`frameworks/base/services/core/java/com/android/server/SystemConfig.java`。根据以上分析,最核心的XML解析功能通常由`XmlPullParser`接口及其实现完成。在Android框架中,具体的解析器实现可以在`frameworks/base/core/java/com/android/internal/util/XmlUtils.java`和`frameworks/base/core/java/org/xmlpull/v1/`中找到。但请注意,实际的底层解析可能由C++代码实现(例如使用expat库),并通过JNI调用。具体到解析XML配置文件的代码位置,取决于你指的是哪种配置文件:-如果是资源文件(如布局、字符串等),那么解析发生在`Resources`中,它会使用`XmlResourceParser`(这是一个组合了`XmlPullParser`和`AttributeSet`的接口)来解析。实现为`XmlBlock.Parser`(在`frameworks/base/core/java/android/content/res/XmlBlock.java`中)。-如果是AndroidManifest.xml,则由`PackageParser`(或新版本中的`ParsingPackageUtils`等)解析。-如果是系统级别的配置文件(如权限文件),则查看`SystemConfig`。因此,要回答用户的问题,我们需要更具体地知道用户指的是哪种XML配置文件。但一般来说,解析XML的通用代码位于:-`frameworks/base/core/java/org/xmlpull/v1/`:包含XmlPullParser接口和工厂。-`frameworks/base/core/java/com/android/internal/util/XmlUtils.java`:提供一些辅助方法。-资源解析的具体实现:`frameworks/base/core/java/android/content/res/`目录,特别是`XmlBlock.java`和`Resources.java`。如果用户想要查看底层的解析器实现(C++部分),那么可以查看:-`libcore/xml/src/main/java/org/xmlpull/v1/`(但这里主要是接口)-实际解析由expat库完成,代码在`external/expat/`目录下。由于用户的问题是关于Androidframework中解析XML配置文件的代码位置,我们假设用户指的是框架中解析资源文件或清单文件的代码。因此,重点可以放在`android.content.res`包和`com.android.server.pm`包。总结一下,对于资源文件解析,主要代码在:-`frameworks/base/core/java/android/content/res/XmlBlock.java`-`frameworks/base/core/java/android/content/res/XmlResourceParser.java`(这是一个接口,实现在XmlBlock.Parser)对于AndroidManifest.xml解析,主要代码在:-`frameworks/base/core/java/android/content/pm/PackageParser.java`(在Android5.0之后,这个被重构,部分功能移到了`PackageParser2`等,但基本思路相同)-或者在新版本中(如Android10+),查看`frameworks/base/core/java/android/content/pm/parsing`包下的。因此,根据用户的需求,我们可以给出以下答案:</think>在Android框架中,XML配置文件解析的核心实现位于以下关键位置: ### 1. **资源文件解析(res/目录)** - **主要文件**:`frameworks/base/core/java/android/content/res/XmlBlock.java` - **核心**:`XmlBlock.Parser` - **功能**:处理布局/资源XML文件(如`activity_main.xml`),通过`Resources`和`AssetManager`加载后,由`XmlBlock.Parser`实现`XmlResourceParser`接口完成解析[^1][^2]。 解析流程示例: ```java XmlResourceParser parser = resources.getLayout(R.layout.activity_main); while (parser.next() != XmlPullParser.END_DOCUMENT) { // 解析标签和属性 } ``` ### 2. **清单文件解析(AndroidManifest.xml)** - **主要文件**:`frameworks/base/core/java/android/content/pm/PackageParser.java` - **核心方法**:`parseBaseApk()` 和 `parseBaseApplication()` - **功能**:解析APK中的`AndroidManifest.xml`,提取组件声明、权限等元数据。使用`XmlPullParser`遍历节点树[^1]。 ### 3. **系统级XML解析(/system/etc/配置)** - **主要文件**:`frameworks/base/services/core/java/com/android/server/SystemConfig.java` - **核心方法**:`readPermissionsFromXml()` - **功能**:解析`/system/etc/permissions/`下的XML文件(如`platform.xml`),处理系统权限和特性配置。 ### 4. **底层XML解析引擎** - **实现库**:`external/XmlPullParser/`(KXML2实现) - **JNI桥接**:`frameworks/base/core/jni/` 下的`android_util_XmlBlock.cpp` - **机制**:通过`XmlPullParser`事件驱动模型(START_TAG, TEXT, END_TAG)逐节点解析[^1]。 ### 关键调用栈示例 ```plaintext 1. 资源加载: Resources.loadXmlResourceParser() → XmlBlock.newParser() → XmlBlock.Parser.parse() 2. 清单解析: PackageParser.parsePackage() → parseBaseApk() → XmlPullParser.next() ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值