XML解析之PULL解析+SAX解析+DOM解析

本文详细介绍了XML的三种常见解析方法:PULL、SAX和DOM。每种方法都通过具体的代码示例进行了说明,包括如何初始化解析器、解析XML文档并提取关键信息。

1.PULL解析

XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
			// 获取XmlPullParser实例
			pullParser = factory.newPullParser();
public List<News> pull(XmlPullParser pullParser, InputStream inStream) {
		News news = null;
		List<News> lists = null;
		try {
			// 设置解析内容
			pullParser.setInput(inStream, "UTF-8");
			// 开始
			int eventType = pullParser.getEventType();

			while (eventType != XmlPullParser.END_DOCUMENT) {
				String nodeName = pullParser.getName();
				switch (eventType) {
				// 文档开始
				case XmlPullParser.START_DOCUMENT:
					lists = new ArrayList<News>();
					break;
				// 开始节点
				case XmlPullParser.START_TAG:
					if ("news".equals(nodeName)) {
						news = new News();
					} else if ("id".equals(nodeName)) {
						news.setId(Integer.parseInt(pullParser.nextText()));
					} else if ("title".equals(nodeName)) {
						news.setTitle(pullParser.nextText());
					} else if ("body".equals(nodeName)) {
						news.setBody(pullParser.nextText());
					} else if ("commentCount".equals(nodeName)) {
						news.setCommentCount(Integer.parseInt(pullParser
								.nextText()));
					} else if ("author".equals(nodeName)) {
						news.setAuthor(pullParser.nextText());
					} else if ("authorid".equals(nodeName)) {
						news.setAuthorid(Integer.parseInt(pullParser.nextText()));
					} else if ("pubDate".equals(nodeName)) {
						news.setPubDate(pullParser.nextText());
					} else if ("url".equals(nodeName)) {
						news.setUrl(pullParser.nextText());
					}
					break;
				// 结束节点
				case XmlPullParser.END_TAG:
					if ("news".equals(nodeName)) {
						lists.add(news);
						news = null;
					}
					break;
				default:
					break;
				}
				// 手动的触发下一个事件
				eventType = pullParser.next();
			}
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		return lists;
	}

2.SAX解析

// 获取SAX解析的工厂类
		SAXParserFactory instance = SAXParserFactory.newInstance();
private void initData(SAXParserFactory instance) {
		try {
			// 获取SAX解析的解析类
			SAXParser newSAXParser = instance.newSAXParser();
			// 获取Xml读取类
			XMLReader xmlReader = newSAXParser.getXMLReader();

			xmlReader.setContentHandler(new DefaultHandler() {
				// 定义全局变量,记录每次读取到的标签的名字
				String temp;
				City city;

				@Override
				public void startDocument() throws SAXException {
					Log.d("print", "startDocument: " + "文档开始读取");
				}

				// 读取到开始标签,通过localName判断读取到了哪一个开始标签
				@Override
				public void startElement(String uri, String localName,
						String qName, Attributes attributes)
						throws SAXException {
					temp = localName;
					Log.d("print", "start: temp" + temp);
					// 判断是不是开始标签
					if ("city".equals(temp)) {
						// 实例化要封装的对象
						city = new City();
						// 获取值,将值封装入对象
						String id = attributes.getValue("id");
						city.setId(Integer.parseInt(id));
					}
				}

				// 得到标签内携带的数据
				@Override
				public void characters(char[] ch, int start, int length)
						throws SAXException {
					// 将字符数组转换成为字符串
					String str = new String(ch, start, length);
					Log.d("print", "characters  :" + str);

					if ("name".equals(temp)) {
						city.setName(str);
					} else if ("type".equals(temp)) {
						city.setType(str);
					} else if ("address".equals(temp)) {
						city.setAddress(str);
					}
				}

				@Override
				public void endElement(String uri, String localName,
						String qName) throws SAXException {
					temp = localName;
					Log.d("print", "end temp :" + temp);
					if ("city".equals(temp)) {
						// 添加到集合
						data.add(city);
						// 对象置空
						city = null;
					}
					// 清空记录变量的标签
					temp = null;
				}

				@Override
				public void endDocument() throws SAXException {
					Log.d("print", "endDocument:" + "文档读取完毕");
				}

			});
			// 设置要读取的源文件
			xmlReader.parse(new InputSource(getAssets().open("city.xml")));

		} catch (Exception e) {
			e.printStackTrace();
			Log.d("print", "异常了:");
		}
	}

3.DOM解析

// 得到DOM解析的工厂类
		DocumentBuilderFactory builderFactory = DocumentBuilderFactory
				.newInstance();
		try {
			// 得到DOM方式的解析类
			DocumentBuilder documentbuilder = builderFactory
					.newDocumentBuilder();
			// 通过输入流设置要解析的xml文件,得到Document(文本对象),包含当前xml的信息
			Document document = documentbuilder.parse(getAssets().open("data.xml"));
			// 获得根元素 (根节点)<persons>
			Element documentElement = document.getDocumentElement();
			// 得到根元素下所有的子节点
			NodeList childNodes = documentElement.getChildNodes();
			// 遍历出根元素下所有的子节点
			for (int i = 0; i < childNodes.getLength(); i++) {
				// 每一个子节点下的数据,都封装成一个对象
				Person p = new Person();
				// 按角标取得相对应的子节点
				Node node = childNodes.item(i);
				// 判断节点是不是元素
				if (node.getNodeType() == Node.ELEMENT_NODE) {
					// 把子节点转换成为元素
					Element element = (Element) node;
					// 得到当前元素的属性节点
					String id = element.getAttribute("id");
					p.setId(Integer.parseInt(id));
					// 得到<person>节点的所有子节点 <name>lee</name>和 <age>30</age>
					NodeList childNodes2 = element.getChildNodes();

					for (int j = 0; j < childNodes2.getLength(); j++) {
						// j=0时,得到 <name>lee</name>,j=1时,得到 <age>30</age>
						Node item = childNodes2.item(j);
						// 判断节点是不是元素点
						if (item.getNodeType() == Node.ELEMENT_NODE) {
							// 把节点转换成为元素
							Element element2 = (Element) item;
							// 得到标签所包含的文本
							String value = element2.getFirstChild()
									.getNodeValue();
							// 如果标签是<name>,取出标签的文本内容,封装到person对象里
							if ("name".equals(element2.getNodeName())) {
								p.setName(value);
							} else if ("age".equals(element2.getNodeName())) {
								p.setAge(Integer.parseInt(value));
							}
						}
					}
					Log.d("print", p.toString());
					// 把封装的信息存入集合中
					data.add(p);

				}

			}
		} catch (ParserConfigurationException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SAXException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}





内容概要:本文围绕六自由度机械臂的人工神经网络(ANN)设计展开,重点研究了正向与逆向运动学求解、正向动力学控制以及基于拉格朗日-欧拉法推导逆向动力学方程,并通过Matlab代码实现相关算法。文章结合理论推导与仿真实践,利用人工神经网络对复杂的非线性关系进行建模与逼近,提升机械臂运动控制的精度与效率。同时涵盖了路径规划中的RRT算法与B样条优化方法,形成从运动学到动力学再到轨迹优化的完整技术链条。; 适合人群:具备一定机器人学、自动控制理论基础,熟悉Matlab编程,从事智能控制、机器人控制、运动学六自由度机械臂ANN人工神经网络设计:正向逆向运动学求解、正向动力学控制、拉格朗日-欧拉法推导逆向动力学方程(Matlab代码实现)建模等相关方向的研究生、科研人员及工程技术人员。; 使用场景及目标:①掌握机械臂正/逆运动学的数学建模与ANN求解方法;②理解拉格朗日-欧拉法在动力学建模中的应用;③实现基于神经网络的动力学补偿与高精度轨迹跟踪控制;④结合RRT与B样条完成平滑路径规划与优化。; 阅读建议:建议读者结合Matlab代码动手实践,先从运动学建模入手,逐步深入动力学分析与神经网络训练,注重理论推导与仿真实验的结合,以充分理解机械臂控制系统的设计流程与优化策略。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值