加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

Xml解析方式之Pull解析器的使用

发布时间:2020-12-16 09:10:20 所属栏目:百科 来源:网络整理
导读:xml有多种解析的方式,这篇文章只介绍用pull解析器来解析XML文件,接下来我会说明使用Pull解析器来读取Xml文件内容和新建Xml文件。 读取Xml文件的内容 我在项目中已经添加了一个Xml文件,“data.xml”,下面是Xml文件里面的内容。 ?xml version="1.0" encodi

xml有多种解析的方式,这篇文章只介绍用pull解析器来解析XML文件,接下来我会说明使用Pull解析器来读取Xml文件内容和新建Xml文件。

  1. 读取Xml文件的内容
    我在项目中已经添加了一个Xml文件,“data.xml”,下面是Xml文件里面的内容。
    <?xml version="1.0" encoding = "utf-8"?>
    <persons>
        <person id = "23">
            <name>Jack</name>
            <age>18</age>
        </person>
        <person id = "20">
            <name>Tom</name>
            <age>21</age>
        </person>
    </persons>
    为了方便操作,我新建了一个Person类:

    public class Person {
    	private int id;
    	private String name;
    	private int age;
    	public int getId() {
    		return id;
    	}
    	public void setId(int id) {
    		this.id = id;
    	}
    	public String getName() {
    		return name;
    	}
    	public void setName(String name) {
    		this.name = name;
    	}
    	public int getAge() {
    		return age;
    	}
    	public void setAge(int age) {
    		this.age = age;
    	}
    	@Override
    	public String toString() {
    		return "Person [id=" + id + ",name=" + name + ",age=" + age + "]";
    	}
    	public Person(int id,String name,int age) {
    		super();
    		this.id = id;
    		this.name = name;
    		this.age = age;
    	}
    	public Person() {
    		
    	}
    }

    然后我又建了一个PersonService类,在这个类里面实现我们的操作。
    public class PersonService {
    	/**
    	 * 获取Xml文件的内容
    	 * @param p_InputStream	Xml文件输入流
    	 * @return	包含Person信息的列表
    	 * @throws Exception
    	 */
    	public static List<Person> getPersons(InputStream p_InputStream) throws Exception{
    		List<Person> persons = null;
    		Person person = null;
    		//得到XmlPullParse对象
    		XmlPullParser pullParser = Xml.newPullParser();
    		pullParser.setInput(p_InputStream,"utf-8");
    		int event = pullParser.getEventType();
    		while(event != XmlPullParser.END_DOCUMENT){
    			switch (event) {
    				case XmlPullParser.START_DOCUMENT:
    					persons = new ArrayList<Person>();
    					break;
    				case XmlPullParser.START_TAG:
    					if("person".equals(pullParser.getName())){
    						person = new Person();
    						int id = new Integer(pullParser.getAttributeValue(0));
    						person.setId(id);
    					}
    					if("name".equals(pullParser.getName())){
    						String name = pullParser.nextText();
    						person.setName(name);
    					}
    					if("age".equals(pullParser.getName())){
    						int age = new Integer(pullParser.nextText());
    						person.setAge(age);
    					}
    					break;
    				case XmlPullParser.END_TAG :
    					if("person".equals(pullParser.getName())){
    						persons.add(person);
    						person = null;
    					}
    					break;
    			}
    			event = pullParser.next();
    		}
    		return persons;
    	}
    	/**
    	 * 保存数据到XML文件中
    	 * @param p_Person		 数据列表
    	 * @param p_Out			输出流
    	 * @throws Exception	抛出异常
    	 */
    	public static void save(List<Person> p_Person,OutputStream p_Out) throws Exception{
    		XmlSerializer serializer = Xml.newSerializer();
    		serializer.setOutput(p_Out,"utf-8");
    		serializer.startDocument("utf-8",true);
    		serializer.startTag(null,"persons");
    		for(Person person:p_Person){
    			serializer.startTag(null,"person");
    			serializer.attribute(null,"id",person.getId()+"");
    			
    			serializer.startTag(null,"name");
    			serializer.text(person.getName());
    			serializer.endTag(null,"name");
    			
    			serializer.startTag(null,"age");
    			serializer.text(person.getAge()+"");
    			serializer.endTag(null,"age");
    			
    			serializer.endTag(null,"person");
    		}
    		serializer.endTag(null,"persons");
    		serializer.endDocument();
    		
    		p_Out.flush();
    		p_Out.close();	
    	}
    		
    }

    在这个类里面,我共定义了两个静态方法,一个用来读取Xml文件的内容,然后把信息放到一个列表中,另一个用来生成Xml文件,保存到手机中。
    读取Xml的时候,我们需要先得到XmlPullParser的对象,利用Xml类的一个静态方法来得到:Xml.newPullParser(),然后我们把Xml文件输入流和XmlPullParse对象进行设置或者说是连接:pullParser.setInput(p_InputStream,"utf-8"),然后就开始解析Xml文件了。
    解析的时候是逐行开始解析的,int event = pullParser.getEventType(),这行代码开始可能不理解,比方说,此时解析器解析的内容是<person id = "23">,那么此时event的值就是XmlPullParser.START_TAG,代表着开始标签,在代码中还有其他的一些值,END_TAG-->结束标签等等。根据event的值,我们就可以知道解析器当前的解析内容是哪一行,然后进行相关的操作。

  2. 新建Xml文件,然后保存到手机上
新建Xml文件的时候,同样要使用封装类,XmlSerializer serializer = Xml.newSerializer(),这样,我们对XmlSerializer的对象进行操作,然后就可以把信息保存到手机上了。

下面是我MainActivity中的代码:

public class MainActivity extends Activity {
	private TextView text;
	StringBuilder sb;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		text = (TextView) findViewById(R.id.text);
		sb = new StringBuilder();
		sb.append("源文件的内容n");
		InputStream xml = getClass().getClassLoader().getResourceAsStream("data.xml");
		try {
			List<Person> persons = PersonService.getPersons(xml);
			for(Person person:persons)
				sb.append(person.toString()).append("n");
			text.setText(sb);
		} catch (Exception e) {}
		sb.append("新建的文件的内容n");
		List<Person> p = new ArrayList<Person>();
		p.add(new Person(13,"lili",18));
		p.add(new Person(23,"liufi",45));
		File xmlFile = new File(getApplicationContext().getFilesDir(),"person.xml");
		try {
			OutputStream outputStream  = new FileOutputStream(xmlFile);
			PersonService.save(p,outputStream);
		} catch (Exception e) {}
		try {
			xml = new FileInputStream(getApplicationContext().getFilesDir()+"/person.xml");
			List<Person> persons = PersonService.getPersons(xml);
			for(int i=0;i<persons.size();i++)
				sb.append(persons.get(i).toString()).append("n");
			text.setText(sb);
		} catch (Exception e1) {}
	}
}
写的 内容不多,代码倒是挺多的,因为内容比较基础,所以看看代码就可以明白解析的方式,多用用就可以很快的掌握了Pull解析器了。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读