链接上一遍 JAXB介绍一 , 本节主要介绍解析xml的步骤, 下面的例子是在实际项目中运用的, 把它拿出来单独写一个java运行程序.

5. 测试实例

先给出我的代码结构图:

再给出要解析的Script.xml文件的内容:

<?xml version='1.0' encoding='UTF-8' ?>
<Script>
<SchemaVersion MajorVerNo="1" MinorVerNo="0" />
<Activity>
<Action>ReinstallTV</Action>
</Activity>
<Activity>
<Action>TuneChannel</Action>
<Priority>1</Priority>
<Attributes>
<ChannelNumber>340</ChannelNumber>
</Attributes>
</Activity>
</Script>

下面进入正题:

1. 给出Script.java的代码, 其实就是对Script.xml的类似Bean构建:

package com.demo.util;

import java.util.List;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType; @XmlRootElement(name = "Script")
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(propOrder = {"schemaVersion","activities"})
public class Script { @XmlElement(name = "SchemaVersion", required = false)
private SchemaVersion schemaVersion; @XmlElement(name = "Activity", required = false)
private List<Activity> activities; public SchemaVersion getSchemaVersion() {
return schemaVersion;
} public void setSchemaVersion(SchemaVersion schemaVersion) {
this.schemaVersion = schemaVersion;
} public List<Activity> getActivity() {
return activities;
} public void setActivity(List<Activity> activities) {
this.activities = activities;
} }

2. 给出SchemaVersion.java的代码:

package com.demo.util;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType; @XmlRootElement(name = "SchemaVersion")
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(propOrder = {"majorVerNo","minorVerNo"})
public class SchemaVersion { @XmlAttribute(name = "MajorVerNo", required = false)
protected String majorVerNo; @XmlAttribute(name = "MinorVerNo", required = false)
protected String minorVerNo; public String getMajorVerNo() {
return majorVerNo;
} public void setMajorVerNo(String majorVerNo) {
this.majorVerNo = majorVerNo;
} public String getMinorVerNo() {
return minorVerNo;
} public void setMinorVerNo(String minorVerNo) {
this.minorVerNo = minorVerNo;
} }

3. 给出Activity.java的代码结构:

package com.demo.util;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType; @XmlRootElement(name = "Activity")
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(propOrder = {"action","priority","attributes"})
public class Activity { @XmlElement(name = "Action", required = false)
protected String action; @XmlElement(name = "Priority", required = false)
protected String priority; @XmlElement(name = "Attributes", required = false)
protected Attributes attributes; public String getAction() {
return action;
} public void setAction(String action) {
this.action = action;
} public String getPriority() {
return priority;
} public void setPriority(String priority) {
this.priority = priority;
} public Attributes getAttributes() {
return attributes;
} public void setAttributes(Attributes attributes) {
this.attributes = attributes;
}
}

4. 给出Attributes.java的代码:

package com.demo.util;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType; @XmlRootElement(name = "Attributes")
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(propOrder = {"channelNumber"})
public class Attributes { @XmlElement(name = "ChannelNumber", required = false)
protected String channelNumber; public String getChannelNumber() {
return channelNumber;
} public void setChannelNumber(String channelNumber) {
this.channelNumber = channelNumber;
} }

5. 给出Test.java对Script.xml处理的代码:

package com.demo.test;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.List; import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Unmarshaller; import com.demo.util.Activity;
import com.demo.util.Script; public class Test { public static void main(String[] args) {
// TODO Auto-generated method stub

   // Script.xml路径可以随时改变
String SCRIPT_XML_PATH = "C:/Script/Script.xml";
try {
File file = new File(SCRIPT_XML_PATH);
JAXBContext jaxbContext = JAXBContext.newInstance(Script.class);
Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
Script script = (Script) unmarshaller.unmarshal(file);
System.out.println("SchemaVersion=>MajorVerNo="+script.getSchemaVersion().getMajorVerNo());
System.out.println("SchemaVersion=>MinorVerNo="+script.getSchemaVersion().getMinorVerNo());
boolean hasReinstallTvCommand = false;
if (script != null) {
List<Activity> activities = script.getActivity();
int activitySize = activities.size();
if (activitySize > 0) {
for(Activity activity : activities) {
System.out.println("Activity:");
if (activity.getAction() != null) {
System.out.println(" Action="+activity.getAction());
if ("ReinstallTV".equalsIgnoreCase(activity.getAction())) {
hasReinstallTvCommand = true;
//break;
}
}
if (activity.getPriority() != null) {
System.out.println(" Priority="+activity.getPriority());
}
if (activity.getAttributes() != null) {
if (activity.getAttributes().getChannelNumber() != null) {
System.out.println(" ChannelNumber="+activity.getAttributes().getChannelNumber());
}
}
}
}
}
System.out.println("hasReinstallTvCommand="+hasReinstallTvCommand); } catch (JAXBException e) {
System.out.println("e="+e.getMessage());
}

6. 给出最后Test.java运行的代码, 打印出的log:

SchemaVersion=>MajorVerNo=1
SchemaVersion=>MinorVerNo=0
Activity:
Action=ReinstallTV
Activity:
Action=TuneChannel
Priority=1
ChannelNumber=340
hasReinstallTvCommand=true

待续...

JAXB介绍二的更多相关文章

  1. Lucene.Net 2.3.1开发介绍 —— 二、分词(六)

    原文:Lucene.Net 2.3.1开发介绍 -- 二.分词(六) Lucene.Net的上一个版本是2.1,而在2.3.1版本中才引入了Next(Token)方法重载,而ReusableStrin ...

  2. Lucene.Net 2.3.1开发介绍 —— 二、分词(五)

    原文:Lucene.Net 2.3.1开发介绍 -- 二.分词(五) 2.1.3 二元分词 上一节通过变换查询表达式满足了需求,但是在实际应用中,如果那样查询,会出现另外一个问题,因为,那样搜索,是只 ...

  3. Lucene.Net 2.3.1开发介绍 —— 二、分词(三)

    原文:Lucene.Net 2.3.1开发介绍 -- 二.分词(三) 1.3 分词器结构 1.3.1 分词器整体结构 从1.2节的分析,终于做到了管中窥豹,现在在Lucene.Net项目中添加一个类关 ...

  4. Lucene.Net 2.3.1开发介绍 —— 二、分词(四)

    原文:Lucene.Net 2.3.1开发介绍 -- 二.分词(四) 2.1.2 可以使用的内置分词 简单的分词方式并不能满足需求.前文说过Lucene.Net内置分词中StandardAnalyze ...

  5. Lucene.Net 2.3.1开发介绍 —— 二、分词(二)

    原文:Lucene.Net 2.3.1开发介绍 -- 二.分词(二) 1.2.分词的过程 1.2.1.分词器工作的过程 内置的分词器效果都不好,那怎么办?只能自己写了!在写之前当然是要先看看内置的分词 ...

  6. Lucene.Net 2.3.1开发介绍 —— 二、分词(一)

    原文:Lucene.Net 2.3.1开发介绍 -- 二.分词(一) Lucene.Net中,分词是核心库之一,当然,也可以将它独立出来.目前Lucene.Net的分词库很不完善,实际应用价值不高.唯 ...

  7. {Django基础十之Form和ModelForm组件}一 Form介绍 二 Form常用字段和插件 三 From所有内置字段 四 字段校验 五 Hook钩子方法 六 进阶补充 七 ModelForm

    Django基础十之Form和ModelForm组件 本节目录 一 Form介绍 二 Form常用字段和插件 三 From所有内置字段 四 字段校验 五 Hook钩子方法 六 进阶补充 七 Model ...

  8. MySQL之多表查询一 介绍 二 多表连接查询 三 符合条件连接查询 四 子查询 五 综合练习

    MySQL之多表查询 阅读目录 一 介绍 二 多表连接查询 三 符合条件连接查询 四 子查询 五 综合练习 一 介绍 本节主题 多表连接查询 复合条件连接查询 子查询 首先说一下,我们写项目一般都会建 ...

  9. MySQL行(记录)的详细操作一 介绍 二 插入数据INSERT 三 更新数据UPDATE 四 删除数据DELETE 五 查询数据SELECT 六 权限管理

    MySQL行(记录)的详细操作 阅读目录 一 介绍 二 插入数据INSERT 三 更新数据UPDATE 四 删除数据DELETE 五 查询数据SELECT 六 权限管理 一 介绍 MySQL数据操作: ...

随机推荐

  1. Entity Framework Code-First(9.6):DataAnnotations - StringLength Attribute

    DataAnnotations - StringLength Attribute: StringLength attribute can be applied to a string type pro ...

  2. Spring入门第二十八课

    事务的传播行为 当事务方法被另一个事务方法调用时,必须指定事务应该如何传播,例如:方法可能继续在现有事务中运行,也可能开启一个新的事务,并在自己的事务中运行. 事务的传播行为可以由传播属性指定.Spr ...

  3. 20169201 2016-2017-2 实验二《Java面向对象程序设计》

    实验一:程序设计中临时变量的使用 代码托管 1.删除数组中的元素5 for(int i = 4; i < arr.length - 1; i ++){ arr[i] = arr[i + 1]; ...

  4. 自签名配置HTTPS

    基于AFN3.0 1.将后台提供的.cer文件文件保存至本地 2.在封装的网络请求工具类中为AFN的AFSecurityPolicy属性赋值 -(AFSecurityPolicy *)customSe ...

  5. surging+EFCore 服务实现入门

    准备工作 本篇文章基于上篇基础上进行的,请先了解此篇  surging+CentOS7+docker+rancher2.0 菜鸟部署运行笔记 开发环境  Visual Studio 2017 15.5 ...

  6. sourcetree 不停的让输入密码,报 password required

    sourcetree 不停的让输入密码,报 password required sourcetree 不停的让输入密码,报 password required1.在终端(terminal)打开你的工程 ...

  7. 水库(树形dp)

    水库 (树形dp) R国有n座城市和n-1条长度为1的双向道路,每条双向道路连接两座城市,城市之间均相互连通.现在你需要维护R国的供水系统.你可以在一些城市修建水库,在第i个城市修建水库需要每年c_i ...

  8. 洛谷P3533 [POI2012]RAN-Rendezvous

    P3533 [POI2012]RAN-Rendezvous 题目描述 Byteasar is a ranger who works in the Arrow Cave - a famous rende ...

  9. 洛谷P3052 [USACO12MAR]摩天大楼里的奶牛Cows in a Skyscraper

    P3052 [USACO12MAR]摩天大楼里的奶牛Cows in a Skyscraper 题目描述 A little known fact about Bessie and friends is ...

  10. 洛谷P4707 重返现世(扩展MinMax容斥+dp)

    传送门 我永远讨厌\(dp.jpg\) 前置姿势 扩展\(Min-Max\)容斥 题解 看纳尔博客去→_→ 咱现在还没搞懂为啥初值要设为\(-1\)-- //minamoto #include< ...