Qt官方教程翻译——Qt QML

Pull 解析器简介

Pull 解析器的运行方式与 SAX 解析器相似。它提供了类似的事件,如: 开始元素和结束元素事件,使用xmlPullParser.next() 可以进入下一个元素并触发相应事件。跟 SAX 不同的 是, Pull 解析器产生的事件是一个数字,而非方法,因此可以使用一个 switch 对事件进行处理。当元素开始解析时,调用 parser.nextText() 方法可以获取下一个 Text 类型节点的值。

Pull解析器的源码及文档下载网址:http://www.xmlpull.org/

解析步骤

1.直接创建出XmlPullParser解析对象

2.设置解析文件输入流并且指定输入流在操作的编码方式

3.获取解析文件时返回的eventType时间类型

4.while循环遍历到文档结尾

5.使用xmlPullParser.next()进入下一个元素并触发

6.switch语句循环遍历结果

7.在标签结束时,进行添加到集合中

8.释放资源

Xml.newPullParser()--->setInput-->getEventType()--->while(type!=XmlPullParser.END_DOCUMENT)-->case
type  --> parser.getName()去判断---->获得的信息添加进对象--->
type = parser.next();指针下移

实例代码:

资源文件china.xml

<?xml version="1.0" encoding="UTF-8"?>
<china dn="day"><city
        cityname="江苏"
        pyName="jiangsu"
        quName="江苏"
        state1="1"
        state2="1"
        stateDetailed="多云"
        tem1="24"
        tem2="19"
        windState="西北风3-4级" />

 <city
        cityname="北京"
        pyName="beijing"
        quName="北京"
        state1="1"
        state2="1"
        stateDetailed="多云"
        tem1="30"
        tem2="19"
        windState="西北风5-6级" />
<city>
          <cityname>河南</cityname>
          <pyName>henan</pyName>
          <quName>河南</quName>
          <state1>1</state1>
          <state2>1</state2>
          <stateDetailed>多云转晴</stateDetailed>
          <tem1>38</tem1>
          <tem2>-1</tem2>
          <windState>东南风2-3级</windState>

</city>

</china>

实体类City.java

package com.example.domain;

public class City {
	private String cityname;
	private String pyName;
	private String quName;
	private String state1;
	private String state2;

	@Override
	public String toString() {
		return "City [cityname=" + cityname + ", pyName=" + pyName
				+ ", quName=" + quName + ", state1=" + state1 + ", state2="
				+ state2 + ", stateDetailed=" + stateDetailed + ", tem1="
				+ tem1 + ", tem2=" + tem2 + ", windState=" + windState + "]";
	}

	private String stateDetailed;
	private String tem1;
	private String tem2;
	private String windState;

	public String getCityname() {
		return cityname;
	}

	public City() {
		super();
	}

	public void setCityname(String cityname) {
		this.cityname = cityname;
	}

	public String getPyName() {
		return pyName;
	}

	public void setPyName(String pyName) {
		this.pyName = pyName;
	}

	public String getQuName() {
		return quName;
	}

	public void setQuName(String quName) {
		this.quName = quName;
	}

	public String getState1() {
		return state1;
	}

	public void setState1(String state1) {
		this.state1 = state1;
	}

	public String getState2() {
		return state2;
	}

	public void setState2(String state2) {
		this.state2 = state2;
	}

	public String getStateDetailed() {
		return stateDetailed;
	}

	public void setStateDetailed(String stateDetailed) {
		this.stateDetailed = stateDetailed;
	}

	public String getTem1() {
		return tem1;
	}

	public void setTem1(String tem1) {
		this.tem1 = tem1;
	}

	public String getTem2() {
		return tem2;
	}

	public void setTem2(String tem2) {
		this.tem2 = tem2;
	}

	public String getWindState() {
		return windState;
	}

	public void setWindState(String windState) {
		this.windState = windState;
	}

	public City(String cityname, String pyName, String quName, String state1,
			String state2, String stateDetailed, String tem1, String tem2,
			String windState) {
		super();
		this.cityname = cityname;
		this.pyName = pyName;
		this.quName = quName;
		this.state1 = state1;
		this.state2 = state2;
		this.stateDetailed = stateDetailed;
		this.tem1 = tem1;
		this.tem2 = tem2;
		this.windState = windState;
	}

}

解析工具类PullXml.java

package com.example.util;

import java.util.ArrayList;
import java.util.List;

import org.xmlpull.v1.XmlPullParser;

import android.util.Xml;

import com.example.domain.City;

public class PullXml {
	public List<City> pullXml() {
		List<City> entities = null;
		City currentCity = null;
		// 1.直接创建出XmlPullParser解析对象
		XmlPullParser xmlPullParser = Xml.newPullParser();
		try {
			// 2.设置解析文件输入流并且指定输入流在操作的编码方式
			xmlPullParser.setInput(getClass().getClassLoader()
					.getResourceAsStream("china.xml"), "UTF-8");

			// 3.获取解析文件时返回的eventType时间类型
			int eventType = xmlPullParser.getEventType();

			// while循环遍历到文档结尾
			while (eventType != XmlPullParser.END_DOCUMENT) {
				switch (eventType) {
				case XmlPullParser.START_DOCUMENT:
					entities = new ArrayList<City>();
					break;
				case XmlPullParser.END_DOCUMENT:

					break;
				case XmlPullParser.START_TAG:

					String name = xmlPullParser.getName();
					if (name.equals("city")) {
						// 声明当前的city对象
						currentCity = new City();
						int count = xmlPullParser.getAttributeCount();
						if (count > 0) {
							/*
							 * cityname="北京" pyName="beijing" quName="北京"
							 * state1="1" state2="1" stateDetailed="多云"
							 * tem1="30" tem2="19" windState="西北风5-6级"
							 */
							currentCity.setCityname(xmlPullParser
									.getAttributeValue(null, "cityname"));
							currentCity.setPyName(xmlPullParser
									.getAttributeValue(null, "pyname"));
							currentCity.setQuName(xmlPullParser
									.getAttributeValue(null, "quname"));
							currentCity.setState1(xmlPullParser
									.getAttributeValue(null, "state1"));
							currentCity.setState2(xmlPullParser
									.getAttributeValue(null, "state2"));
							currentCity.setStateDetailed(xmlPullParser
									.getAttributeValue(null, "stateDetailed"));
							currentCity.setTem1(xmlPullParser
									.getAttributeValue(null, "tem1"));
							currentCity.setTem2(xmlPullParser
									.getAttributeValue(null, "tem2"));
							currentCity.setWindState(xmlPullParser
									.getAttributeValue(null, "windState"));
						}

					} else if (currentCity != null) {
						/*
						 * <cityname>河南</cityname> <pyName>henan</pyName>
						 * <quName>河南</quName> <state1>1</state1>
						 * <state2>1</state2>
						 * <stateDetailed>多云转晴</stateDetailed> <tem1>38</tem1>
						 * <tem2>-1</tem2> <windState>东南风2-3级</windState>
						 */
						if (name.equalsIgnoreCase("cityname")) {
							currentCity.setCityname(xmlPullParser.nextText());
						} else if (name.equalsIgnoreCase("pyName")) {
							currentCity.setPyName(xmlPullParser.nextText());
						} else if (name.equalsIgnoreCase("quName")) {
							currentCity.setQuName(xmlPullParser.nextText());
						} else if (name.equalsIgnoreCase("state1")) {
							currentCity.setState1(xmlPullParser.nextText());
						} else if (name.equalsIgnoreCase("state2")) {
							currentCity.setState2(xmlPullParser.nextText());
						} else if (name.equalsIgnoreCase("stateDetailed")) {
							currentCity.setStateDetailed(xmlPullParser
									.nextText());
						} else if (name.equalsIgnoreCase("tem1")) {
							currentCity.setTem1(xmlPullParser.nextText());
						} else if (name.equalsIgnoreCase("tem2")) {
							currentCity.setTem2(xmlPullParser.nextText());
						} else if (name.equalsIgnoreCase("windState")) {
							currentCity.setWindState(xmlPullParser.nextText());
						}

					}
					break;
				case XmlPullParser.END_TAG:

					String names = xmlPullParser.getName();
					// 在标签结束时,进行添加到集合中
					if (xmlPullParser.getName().equalsIgnoreCase("city")
							&& currentCity != null) {
						// 添加到集合中
						entities.add(currentCity);
						//释放资源
						currentCity = null;
					}
					break;

				default:
					break;
				}

				// 使用xmlPullParser.next()进入下一个元素并触发
				eventType = xmlPullParser.next();
			}
		} catch (Exception e) {
			e.printStackTrace();
		}

		return entities;
	}
}

运行结果

用上篇讲解的测试方法测试程序结果 :

Qt官方教程翻译——Qt QML

时间: 2024-08-02 15:10:07

Qt官方教程翻译——Qt QML的相关文章

Qt官方教程翻译——The QML Reference

附网址:http://qt-project.org/doc/qt-5/qmlreference.html The QML Reference QML是用来创建高度动态应用程序的声明式语言.在QML中,应用程序通过类似UI组件这样的模块搭建起来,通过设置这些模块的属性可以定义应用程序的行为.当与JavaScript结合起来时,应用程序的行为将变得脚本化.另外,QML大量使用Qt,它允许QML直接访问类型和其他Qt特性. 这个参考手册描述了QML语言的特性.手册中很多QML类型来源于Qt QML或Q

Qt官方教程翻译——Qt Quick

附网址:http://qt-project.org/doc/qt-5/qtquick-index.html Qt Quick Qt Quick组件是编写QML应用程序的标准库.Qt QML组件提供了QML的引擎和语言基础,Qt Quick组件则提供了QML创建用户图形界面的所有基本类型.它提供了一个可视化的画布,以及创造可视化组件.接收用户输入.创造数据模型和视图.延迟实例化对象等多种类型(types). Qt Quick组件还提供了一个QML API为QML语言创建用户界面提供QML类型,以及

Qt官方教程翻译——Use Case - Visual Elements In QML

附网址:http://qt-project.org/doc/qt-5/qtquick-usecase-visual.html Use Case - Visual Elements In QML -- 用例 - QML中的可视化元素 The Rectangle Type -- 矩形 对于最基本的视觉元素,Qt Quick提供了Rectangle类型来绘制矩形.这些矩形可以使用纯色或渐变色来填充.Rectangle类型也可以绘制矩形的边界(borders). 要绘制矩形无法绘制的自定义形状,可以参考

Qt官方教程翻译——First Steps with QML

附网址:http://qt-project.org/doc/qt-5/qmlfirststeps.html Creating a QML Document 一个QML文件定义了对象的层次结构:具有高度可读的,结构化的布局.每个QML文件由两部分组成:一个引入(import)部分,以及一个对象声明(declaration)部分.用户界面中最常用的的类型(types)和功能由引入QtQuick提供. Importing and Using the QtQuick Module 为了使用Qt Quic

Qt官方教程翻译——Use Case - Responding To User Input in QML

附网址:http://qt-project.org/doc/qt-5/qtquick-usecase-userinput.html Supported Types of User Input-- 用户输入的支持类型 Qt Quick模块提供了支持常用用户输入的支持类型(types),包括鼠标和触摸事件,文本输入和按键按下事件.其他模块也分别提供了针对其他用户输入的响应类型(例如,Qt Sensors模块提供了对"摇一摇"的支持). 这篇文档介绍了如何处理基本的用户输入:要了解更多关于运

Qt官方教程翻译——QML Applications

附网址:http://qt-project.org/doc/qt-5/qmlapplications.html QML Applications QML是一种声明式语言,它提供了一组接口用来描述视觉组件以及他们的互动和相关性.它是一个高度可读的语言,并且被设计成使组件以一个动态的方式相互连接.同时它使组件很容易被复用以及创建定制的用户界面.使用QtQuick模块,设计者和开发者可以很容易使用QML建立流体动画的用户界面,并将这些界面连接到后端的C++库上面. What is QML? QML是一

Qt官方教程翻译——Glossary Of QML Terms

附网址:http://qt-project.org/doc/qt-5/qml-glossary.html Glossary Of QML Terms -- QML各术语词汇表 Common Terms -- 通用术语 术语 定义 QML 编写QML应用程序所使用的语言,由Qt QML组件实现语言架构和引擎. Qt Quick QML语言的标准类型与功能库,由Qt Quick组件提供,并通过"importQtQuick 2.0"来使用. Type 在QML中,一个type有可能是一种Ba

Qt官方教程翻译——QML Coding Conventions

附网址:http://qt-project.org/doc/qt-5/qml-codingconventions.html QML Coding Conventions 这个文档包含了QML的编码规范,我们将这个规范应用在全部文档和例程当中并推荐大家遵守. QML Object Declarations 在我们的文档和例子中,QML object attributes总是像下面这样的结构: id property declarations signal declarations JavaScri

Qt官方教程翻译——Using Qt Quick Designer

附网址:http://qt-project.org/doc/qtcreator-3.1/creator-using-qt-quick-designer.html Using Qt Quick Designer 你可以在Qt Quick Designer可视化编辑器或者代码编辑器中编辑.qml文件. 在工程中双击一个.qml文件可以在代码编辑器中打开它,然后选择设计模式在可视化编辑器中打开它. 使用可视化编辑窗格来管理你的工程: 导航面板(1):以树结构形式显示当前QML文件中的各个项目. 库面板