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();
}