(5)⼆次开发之XML格式数据解析
1、⾸先理解⼀下html
html的全名是:HyperText Transfer markup language 超级⽂本标记语⾔,html本质上是⼀门标记(符合)语⾔,在html⾥,这些标记是事先定义(规则)好的,并且赋予了其特定的含义。有⼀套 固定的标记的集合。
⽹页⽂件的扩展名是 .html或者 .htm,都是可⾏的。
⽂档声明:<!doctype html> 这⾥的doctype不管是⼤⼩写都是可以的,并且兼容html4/html5。
html中的标记⼀般都是有开始标签和结束标签,例如:<html>...</html>、<body>...</body>等标签。但是也有⼀些标签是没有内容主体的,可以直接写成:<br />、<hr />.
在html⾥的所有标签都是有固定含义的,不能⾃⼰随便去定义,虽然有⼀些是⾃定义的标签,但是最终还是继承和使⽤html的固定标签。
编写html的时候使⽤的⼀些编辑器,例如:notepad++、editplus、hbuilder等。
2、理解XML
xml的全名是:Extensible Markup Language 可扩展标记语⾔,在xml⽂件⾥的所有标签都是可以⾃由定于的。
xml的扩展名为:.xml
xml⽂件头部信息为:<?xml version="1.0" ?>
xml⽂件有且只有⼀个跟节点
xml中的节点与节点之间可以允许嵌套
3、⼆次开发中使⽤XML的理解
由于协议数据传输其实就是采⽤xml格式进⾏传输,所以我们必须要了解xml的格式以及传输数据的解析和⽣成。
当A⽤户 -> 发送数据消息 -> 给B⽤户,中间需要服务器进⾏中转。例如:⽂本消息协议格式(该功能的数据传输是基于xml格式)
⽂本消息格式(⽤户发送给服务,服务器接收的格式)如下:
1<xml>
2<ToUserName><![CDATA[toUser]]></ToUserName>
3<FromUserName><![CDATA[fromUser]]></FromUserName>
4<CreateTime>1348831860</CreateTime>
5<MsgType><![CDATA[text]]></MsgType>
6<Content><![CDATA[你好]]></Content>
7<MsgId>1234567890123456</MsgId>
8</xml>
如图解析:
根据上⾯的xml格式,<![CDATA[ ]]>这类型的数据是指字符数据,CDATA是由character(字符)和data(数据)的简称缩写。
每个⽤户是通过openid来加以区分的,⽽openid就是根据个⼈的号进⾏⼀定的加密算法锁构
成的,openid是由字母、数字、构成的⼀串字符串(该长度是28位)。在我们⾃⼰的服务器上收到的还是与原来的服务器所转发过来的xml格式串还是⼀致的。所以我们就需要在我们⾃⼰的服务器的程序⾥进⾏解析 xml格式串。
4、xml格式解析
⽬前在java⾥⾯对xml解析有4种⽅法:
1、DOM(Documemt Object Model)⽂档对象模型,Dom是⼀次性读取整个⽂档,如果xml⽂档⽐较⼤,节点⽐较多的情况下,解析的时候⽐较消耗资源、内存,性能⽐较低,不建议使⽤。
2、SAX(Simple API for XML)。使⽤SAX解析,是基于事件驱动⽅式来解析xml。解析器在读取xml⽂件根据读取的数据产⽣相应的事件,解析速度快,占⽤内存少,性能⽐较好。
3、DOM4J是第三⽅类库,对SAX解析进⾏了封装。
4、JDOM也是第三⽅类库,也是对SAX解析进⾏了封装。
DOM与SAX解析⽅式是java⾃带的,不需要第三⽅额外的jar包。⼆DOM4J和JDOM都是第三⽅开源的,使⽤的时候需要下载⽀持第三⽅⽀持的jar包。
5、声明⼀个xml⽂件使⽤4种⽅式进⾏解析
创建⼀个parseXml的java项⽬,将创建以⼀个l⽂件,
如图显⽰:
编辑xml⽂件:
1<?xml version="1.0" ?>
2<!-- 所在部门标签 -->
3<department>
4<!-- 员⼯标签:属性number是⼯号 -->
5<employee number="001">
6<!-- 员⼯的个⼈信息 -->
7<name>⼩海</name>
8<sex>男</sex>
9<profession>java开发</profession>
10<hobby>⾜球</hobby>
11</employee>
12<employee number="002">
13<!-- 员⼯的个⼈信息 -->
14<name>婷菲</name>
15<sex>⼥</sex>
16<profession>C#开发</profession>
17<hobby>跑步</hobby>
18</employee>
19</department>
这⾥的xml⽂件放在(我本地的位置):
/Users/wangxianhai/work_sts_01/parseXML/src/com/aixunma/l 6、声明XML⽂档内容信息的类
1package l;
2
3/**
4 * XML⽂档内容信息的对应的字段
5 * <p>类的描述:</p>
6 * <p>@Description: TODO</p>
7 * <p>@author⼩海</p>
8 * <p>@time:2017年4⽉29⽇下午6:04:00</p>
使用dom4j解析xml文件9 * <p>@Vesion: 1.0</p>
10*/
11public class XmlParam {
12
13public static final String LABLE_EMPLOYEE = "employee"; // 员⼯标签
14public static final String LABLE_NAME = "name"; // 名称标签
15public static final String LABLE_SEX = "sex"; // 性别标签
15public static final String LABLE_SEX = "sex"; // 性别标签
16public static final String LABLE_PROFESSION = "profession"; // 职业标签17public static final String LABLE_HOBBY = "hobby"; // 爱好标签
18
19private int number;
20private String name;
21private String sex;
22private String profession;
23private String hobby;
24
25public int getNumber() {
26return number;
27 }
28public void setNumber(int number) {
29this.number = number;
30 }
31public String getName() {
32return name;
33 }
34public void setName(String name) {
35this.name = name;
36 }
37public String getSex() {
38return sex;
39 }
40public void setSex(String sex) {
41this.sex = sex;
42 }
43public String getProfession() {
44return profession;
45 }
46public void setProfession(String profession) {
47this.profession = profession;
48 }
49public String getHobby() {
50return hobby;
51 }
52public void setHobby(String hobby) {
53this.hobby = hobby;
54 }
55 @Override
56public String toString() {
57 StringBuilder builder = new StringBuilder();
58 builder.append("number=").append(number).append("\n")
59 .append("name=").append(name).append("\n")
60 .append("sex=").append(sex).append("\n")
61 .append("profession=").append(profession).append("\n")
62 .append("hobby=").append(hobby).append("\n");
String();
64 }
65 }
7、实现DOM⽅式解析xml
1package l;
2
3import java.io.File;
4
5import javax.security.auth.login.LoginException;
l.parsers.DocumentBuilder;
l.parsers.DocumentBuilderFactory;
8
9import org.apachemons.lang.StringUtils;
10import org.w3c.dom.Document;
11import org.w3c.dom.Element;
12import org.w3c.dom.Node;
13import org.w3c.dom.NodeList;
14
15/**
16 * 使⽤DOM解析xml⽂件
17 * <p>类的描述:</p>
18 * <p>@Description: TODO</p>
19 * <p>@author⼩海</p>
20 * <p>@time:2017年4⽉29⽇下午2:28:27</p>
21 * <p>@Vesion: 1.0</p>
22*/
23public class DomPaeseXML {
24/**
25 * 解析xml⽂档内容
26 * @return
27 * @throws Exception
28*/
29public static String parseXMl() throws Exception {
30
31// 1、创建⼀个⽂档构建⼯⼚对象
32final DocumentBuilderFactory dbf = wInstance();
33
34// 2、通过⼯⼚对象创建⼀个⽂档构造器对象
35final DocumentBuilder db = wDocumentBuilder();
36
37// 3、声明xml⽂件在本地的路径,并且加载该xml⽂件
38final String path = "/Users/wangxianhai/work_sts_01/parseXML/src/com/aixunma/l"; 39final File file = new File(path);
40
41// 4、通过⽂档构造器解析⽂件加载的对象成⽂档对象
42final Document parse = db.parse(file);
43
44// 5、通过⽂档对象获取头部节点
45final Element headNode = DocumentElement();
46
47final StringBuilder builder = new StringBuilder();
48
49// 6、通过头节遍历下⾯的⼦节点列表
50final NodeList childNodes = ChildNodes();
51if (childNodes == null) {
52return "";
53 }
54 parseXmlToStr(childNodes, builder);
String();
56 }
57
58/**
59 * 将节点列表遍历⽣成字符串
60 * @param childNodes 节点列表
61 * @param builder 记录节点内容
62 * @return
63*/
64public static StringBuilder parseXmlToStr(NodeList childNodes, StringBuilder builder) {
65// 判断节点列表是否为空
66if (childNodes == null) {
67return builder;
68 }
69
70// 遍历节点列表
71for (int i = 0; i < Length(); i++) {
72// 获取⼦节点
73final Node iemt = childNodes.item(i);
74// 因为节点⼜好⼏种类型,需要判断属于ELEMENT_NODE类型的
75if (iemt != null && NodeType() == Node.ELEMENT_NODE) {
76// 节点的内容值
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论