xml使用

xml简介

XML:可扩展标记语言。类似Html的标签文件,只是它的标签可以由开发人员自己命令。
发展历史:html---->xhtml---->xml

xml的作用##

xml:它是用来存储和传输数据的,而html是用来显示数据。

1.传输数据:
android客户端可以发送xml文件给Java ee服务器端,由服务器端用相应的解析引擎将该xml文件解析成相应的Java类对象。同理,服务器也可以用相同的方式这样运作。
比如现在要传输省市的数据:

<数据>
<省 id=”p001”  name=”广东省”>
<市 id=”c001”>
<市名>深圳市</市名>
</市>
<市 id=”c002”>
<市名>东莞市</市名>
</市>
<市 id=”c003”>
<市名>广州市</市名>
</市>
</省>
</数据>

2.存储数据:
软件启动的配置文件:360,qq都有xml文件记录配置信息。

xml的语法

一个XML文件分为如下几部分内容:
文档声明
元素
属性
注释

CDATA区 、特殊字符
处理指令(processing instruction)

1.文档声明:
xml中的文档声明:声明当前这个文档是一个xml文档。xml的文档声明需要书写在第一行。
格式:

<?xml version=”1.0”  encoding=”编码表名称” standalone=”yes|no” ?>

varsion 是声明当前xml的版本号,它的值就是1.0
encoding 是告诉解析引擎当前的xml文件使用什么编码表进行解析。
standalone 当前的xml是否依赖其他的文件

注意事项:在书写声明的时候 尖括号和?之间不能有其他的符号 ?和xml之间也不能有其他的符号。还有保存文件时的编码要与encoding声明的编码一样。

2.元素(标签):
xml中的标签书写:
xml文档的标签由开发者自己指定。
基本的语法要求:
1、xml的标签区分大小写。
2、xml中的也有单标签和双标签,不管是单标签还是双标签都需要闭合

3、书写的标签名 可以是 数字 字母 下划线,但不能以数字开始。
在标签上不要书写? : 空格 等符号
4、 标签上如果有属性,这个属性也可以写成标签的子标签

	< student id = “s123”>< /student>
	< student>
	< id>s123< /id>
	< /student>

5、如果xml需要使用java程序去解析的话,标签后面最好不要写回车。
标签后面的回车内容会解析成当前这个标签的子标签文本。真正是给解析程序使用的xml可以把其中的所有回车全部删除。
< student>< id>s123</ id>< /student>

3.xml属性:
xml的标签上要求书写的属性都必须使用单引号 或者双引号引用

<student id="s123"><name>zhangshan</name><age></age></studnet> 

4.xml注释:
注释的格式:

<!-- 注释的内容 -->

在xml中书写的注释,解析引擎会把其显示出来。

5.文本区域(CDATA区):
对于"<"这种符号,在xml里会与标签产生歧义,所以可以将它放在显示

<![CDATA[
   if(a < b){
         System.out.println("a比b小");
   }
]]>

6.处理指令
在XML文档中可以使用xml-stylesheet指令,通知XML解析引擎,应用css文件显示xml文档内容。

<?xml-stylesheet type="text/css" href="1.css"?>

7.xml的约束介绍
由于xml可以自定义标签,无法让多人协同工作,为了使其规范化,产生了DTD约束和Schema约束。
DTD约束:是用来约束所有的标签,包括自定义的标签。
Schema约束:是用来约束标签里的text内容。

xml解析

民间组制定了xml的解析(事实解析):这个解析是基于事件在解析:它在加载xml文件的时候,不是全部加载,加载到文件开始的时候,触发文档开始事件,如果解析到某个标签的开始,会触发标签开始的事件。

常用的第三方公司的解析jar包:
pull解析:主要是在客户端软件中进行xml的解析。
jdom解析:
dom4j解析:
xstream解析:

pull解析的jar包: kxml2-2.3.0.jar, xmlpull_1_1_3_4c.jar

pull解析技术

pull解析是基于民间制定的sax解析标准完成:

将person.xml文件解析出person对象,注意标签后面不要回车,回车有可能会被当成一个标签被解析出来

<?xml version = "1.0" encoding = "utf-8"?>
<persons>
<person id="1"> 
 <name>黄飞鸿</name>
 <sex>男</sex>
 <age>32</age>
</person>
<person id="2"> 
 <name >陈奕迅</name>
 <sex>男</sex>
 <age >43</age>
</person>
</persons>

@Test
public void parseToList() throws Exception {

	InputStream fis = new FileInputStream("./res/person.xml");

	XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
	 
	XmlPullParser xpp = factory.newPullParser();

	xpp.setInput(fis, "utf-8");

	List<Person> list = new ArrayList<Person>();
	Person p = null;
	int type = xpp.getEventType();
	do {
		switch (type) {
		case XmlPullParser.START_DOCUMENT:

			break;
		case XmlPullParser.START_TAG:
		{
			String tagName = xpp.getName();

			if (tagName.equals("persons")) {

			} else if (tagName.equals("person")) {
				p = new Person();
				p.setId(Integer.parseInt(xpp.getAttributeValue(null, "id")));

			} else if (tagName.equals("name")) {
				p.setName(xpp.nextText()); 

			} else if (tagName.equals("sex")) {
				p.setSex(xpp.nextText());

			} else if (tagName.equals("age")) {
				p.setAge(Integer.parseInt(xpp.nextText()));

			}
		}
		break;
		case XmlPullParser.END_TAG: {
			String tagName = xpp.getName();
			if (tagName.equals("person"))
				list.add(p);
		}
			break;
		default:
			break;

		}

	} while ((type = xpp.next()) != XmlPullParser.END_DOCUMENT);
     System.out.println(list);
}

将对象存储到xml文件中

@Test
 public void objectToXml() throws Exception{
	 Person p=new Person(3,"小薇","女",23); 
	 XmlSerializer sl = XmlPullParserFactory.newInstance().newSerializer();
	 //设置输出的文件地址
	 sl.setOutput(new FileOutputStream("per.xml"), "utf-8");
	 //utf-8编码,true代表该xml文件是独立的即 standalone=”yes|no” 
	 sl.startDocument("utf-8", true);
	 //前面是命名空间,用来约束该标签的行为
	 sl.startTag(null, "persons");
	 sl.startTag(null, "person");
	 sl.attribute(null,"id", p.getId()+"");
	 
	 sl.startTag(null, "name");
	 sl.text(p.getName());
	 sl.endTag(null, "name");
	 
     sl.startTag(null, "sex");
	 sl.text(p.getSex());
	 sl.endTag(null, "sex");

	 sl.startTag(null, "age");
	 sl.text(p.getAge()+"");
	 sl.endTag(null, "age");
	 
	 sl.endTag(null, "person");
	 sl.endTag(null, "persons");
	 sl.endDocument();
 }
posted @ 2015-08-28 18:59  beyondbycyx  阅读(166)  评论(0编辑  收藏  举报