DOM 解析 XML

DOM(Document Object Model)是一种用于解析XML文档的对象模型,可直接访问XML文档的各部分。
【优点】易于理解,不涉及回调和复杂的状态管理
【缺点】将XML节点保存在内存中,效率较为低下
--------------------详细见《android4.0网络编程详解》87页
使用步骤:
①:针对从XML中获取到的信息,需对其建立一个对象(例:Person),存放相关信息
②:创建DocumentBuilderFactory,由该对象可创建DocumentBuilder
③:解析文件获得包含XML信息的Document对象
④:测试需要,建立一个person.xml文件,内容如下:
<?xml version="1.0" encoding="UTF-8" ?>
<persons>
<person id="23">
<name>Test</name>
<age>21</age>
</person>
</persons> 
⑤:在应用中通过
InputStream is = MainActivity.class.getClassLoader().getResourceAsStream("person.xml");
加载需要解析的文件


【附】:android应用单元测试方法
①:在AndroidManifest.xml中添加节点
<uses-library android:name="android.test.runner" />
<instrumentation android:name="android.test.InstrumentationTestRunner"
        android:targetPackage="cn.gzu.xmlparsertest" />
②:建立测试类继承AndroidTestCase


【源代码如下:】
*/
/****************************************【源码】START**************************************************/

//1.Person.java

public class Person {
	private Integer id;
	private String name;
	private short age;
	
	public Person() {
		super();
	}
	public Person(String name, short age) {
		super();
		this.name = name;
		this.age = age;
	}
	public Person(Integer id, String name, short age) {
		super();
		this.id = id;
		this.name = name;
		this.age = age;
	}
	// getter and setter ...
}


//2.DomParserService.java
public class DomParserService {
	/** DOM 解析Xml文档 */
	public static List<Person> getPersons(InputStream is) throws Exception{
		List<Person> persons = new ArrayList<Person>();
		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
		DocumentBuilder builder = factory.newDocumentBuilder();
		Document document = builder.parse(is);
		
		Element root = document.getDocumentElement();
		
		NodeList personsNodes = root.getElementsByTagName("person");
		
		for(int i=0;i<personsNodes.getLength();i++){
			Element personElement = (Element) personsNodes.item(i);
			int id = Integer.valueOf(personElement.getAttribute("id"));
			Person person = new Person();
			
			person.setId(id);
			NodeList childNodes = personElement.getChildNodes();
			for(int j=0;j<childNodes.getLength();j++){
				if(childNodes.item(j).getNodeType() == Node.ELEMENT_NODE){
					if("name".equals(childNodes.item(j).getNodeName())){
						person.setName(childNodes.item(j).getFirstChild().getNodeValue());
					}else if("age".equals(childNodes.item(j).getNodeName())){
						person.setAge(new Short(childNodes.item(j).getFirstChild().getNodeValue()));
					}
				}
			}
			persons.add(person);
		}
		is.close();
		return persons;
	}
}



//3.单元测试类 SAXParserTest.java
public class SAXParserTest extends AndroidTestCase {
	private static final String TAG = "SAXParserTest";
	
	public void testDOMGetPerson() throws Throwable{
		InputStream is = this.getClass().getClassLoader().getResourceAsStream("person.xml");
		List<Person> persons = DomParserService.getPersons(is);
		String text = "";
		for(Person p:persons){
			text = text + "ID: "+p.getId()+" Name: "+p.getName()+" Age: "+p.getAge()+"\n";
		}
		Log.i(TAG, text);
	}
}




//4.MainActivity.java
public class MainActivity extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
		TextView main = (TextView) findViewById(R.id.main_content);
		
		InputStream is = MainActivity.class.getClassLoader().getResourceAsStream("person.xml");
		try {
			List<Person> persons = testDOM(is);
			String text = "";
			for(Person p:persons){
				text = text + "ID: "+p.getId()+" Name: "+p.getName()+" Age: "+p.getAge()+"\n";
			}
			main.setText(text);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	private List<Person> testDOM(InputStream is) throws Exception{
		return DomParserService.getPersons(is);
	}
	
}

//6.AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="cn.gzu.xmlparsertest"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="18" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <uses-library android:name="android.test.runner" />
        
        <activity
            android:name="cn.gzu.xmlparsertest.MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
    
    <instrumentation android:name="android.test.InstrumentationTestRunner"
        android:targetPackage="cn.gzu.xmlparsertest" />

</manifest>


/****************************************【源码】END**************************************************/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值