XML 与 XML Schema的使用教程

引言:我写本文的宗旨在于给需要使用XML,而又对XML不是很熟悉的人们提供一种使用思路,而不没有给出具体的

      使用方法,至于下文中提到的使用方法,还未尝试过,都是从网上整理而来!

 

一、概述

什么是XML?

  xm是l可扩展标记语言缩写,xml是互联网数据传输的重要工具,它可以跨越互联网任何的平台,不受编程语言和

操作系统的限制,可以说它是一个拥有互联网最高级别通行证的数据携带者。xml是当前处理结构化文档信息中相当

给力的技术,xml有助于在服务器之间穿梭结构化数据,这使得开发人员更加得心应手的控制数据的存储和传输。

 

在使用XML时,还必须接触到一个DTD的概念,此处没有做说明,参考:Schema和DTD的区别 

 

什么是XML Schema?

  XML Schema是对XML文档结构的定义和描述,其主要的作用是用来约束XML文件,并验证XML文件有效性。

DTD的作用是定义XML的合法构建模块,它使用一系列的合法元素来定义文档结构。

个人理解:由于XML中可以使用自己定义的元素,由于是自己定义的,当给别人使用的时候,别人怎么知道你的XML

文件中写是什么东西呢?这就需要在XML Scheme文件中声明你自己定义了些什么元素,这些元素都有些什么属性。

 

系统的学习的教程如下:

XML使用教程  

XML Schema使用教程

 

二、使用步骤及案例

1. 解析XML文件(XML的解析使用 - 消费者)

  在比较大的项目中,我们有时会用到服务这个概念,一些服务会以xml的形式返回结果,这个时候就要对XML进行解析,

但很多时候,我们对服务提供的XML结构不甚了解,就算了解了,如果服务被修改XML结构被改变,这个时候以前写好

的解析XML的方法就会出现紊乱,如何解决这个问题呢?其实标准的服务在提供给用户XML的时候会提供给用户对应的

XML描述文件,这就是XSD文件,对此文件进行解析后再利用解析后的XSD文件对XML进行解析,这样即使服务节点变了,

后台的代码也能正确解析当前服务返回的XML文件。

 

使用方法,参考(案例1):

https://luo-yifan.iteye.com/blog/2036072

 

我们在使用XSD文件的时候,可以通过cmd命令的形式,将XSD文件生成java文件,生成方法参考:

使用jdk的xjc命令由schema文件生成相应的实体类

 

另外附上一篇写的比较好的xml文件解析的基础教程,参考:

 XML文件详解以及解析

 

案例2:解析XML文件中的数据,然后将解析后的数据保存到数据库

参考:

 java解析xml并把节点值存储到数据库中

 

2. 生成XML文件(生产者)

案例1:java制作xml文件

参考:java生成XML文件

 

案例2:根据xsd定义的xml格式封装数据并生成xml文件

参考:https://zmft1984.iteye.com/blog/798384

背景:

  在项目组最近一次的版本开发中,有个需求是将我们项目数据库中的基础数据生成到xml文件中,并通知第三方获取这个xml文件。

刚开始是想将数据按照xml的格式拼接成字符串,并逐行的写到文件中,但是总觉得这样做和java的面向对象格格不入。于是baidu了一

下,果然有比拼接字符串更好的办法,具体实现步骤如下:
(1) 将要生成的xml文件的格式编写到xsd文件中,如我们项目中用到的Channel.xsd;
(2) 借助于jdk的xjc命令,将xml中的节点转换成java对象类以供数据封装,具体实现是编写一个bat文件,直接执行bat文件即可;
(3) 准备数据封装,将从数据库中查询出来的数据按照xml格式从底层节点开始,逐层向上封装;
(4) 使用jdk的JAXBContext将封装好的数据输出到xml文件。

 

案例3:根据xsd定义的xml格式封装数据并生成xml文件

背景概述:

  由于很多厂家在开发同一套系统,而我们公司只是参与了系统中的一部分,因此别的公司要求我们公司

将系统中某几个模块功能的数据封装成为一个xml文件(当系统中这几个模块点击添加,然后是填写各种数据,

最后保存表单提交时需要生产一个xml文件),然后上传到ftp服务器,其他公司给我们提供了一个XSD文件,

里面描述了对生产XML文件的要求,同时也还提供了一个word文档说明哪个元素里面放什么内容。

开发步骤:

  其实,这个需求就相当于案例2中的一样,说白了就是要我们根据xsd定义的xml格式封装数据,并生产xml文件。

但是感觉使用案例2中的方式太过去麻烦,于是就想有没没有什么简单的方式呢?于是:

由于公司使用的是springboot框架,里面有一个东西叫thymeleaf,而我们可以自己定义模板,于是我们基于模板去生成

xml文件。

具体步骤:

(1) 更具提供的xsd文档,自己制作一个html模板,并将自己制作的这个模板和springboot集成;

(2) 将自己系统中的业务数据传递给这个模板,然后通过thymeleaf中的表达式写到这个html模板上(类似于我们平时渲染html页面一样);

(3) 将渲染完的这个模板后缀修改为.xml,然后通过ftp上传到别的公司要求的目标地址上。

 

具体代码的话后期在提供:

 代码业务方法:

/**
 * 测试类
 */
public class Test{

    @Autowired
    private IUserService userService;

    @Test
    public void test(){        
        //这里对应的是user模板.html页面
        ModelAndView view = new ModelAndView("user模板");
        view.addObject("username", "gaigai");
        view.addObject("age", 23);
        userService.upload(view,"user自动发布文件.xml");
    }
}
View Code

UserServiceImpl中的给springboot添加模板的方法:

springboot中模板引擎的使用,可以参考:thymeleaf模板引擎入门(当然,这个参考文档没有用springboot,

如果用springboot的话,集成起来应该更方便!)

public void upload(ModelAndView view, String filename) {

    FtpClient ftpClient = null;
    try {
        //Context用于保存模板中需要的一些变量。例如要把变量传递到模板中,
        //就可以先把变量放入IContext的实现类中,然后在模板中获取该变量的值。
        Context context = new Context(Locale.CHINESE,view.getModel());
        
        //process方法用于解析模板并利用当前response对象的writer把模板输出到浏览器。
        String template = templateEngine.process(view.getViewName(), context);
        
        //通过ftp服务器上传到指定的目录
        ByteArrayInputStream bais = new ByteArrayInputStream(template.getBytes("UTF-8"));
        ftpClient = ftpSource.borrowObject();
        ftpClient.putFile(filename,bais);
    } catch (Exception e) {
        //"获取ftp连接异常!
    } finally {
        if(ftpClient != null){
            ftpSource.returnObject(ftpClient); //org.apache.commons.pool2 jar包
        }

    }
}
View Code

user模板.html 页面为:

<?xml version="1.0" encoding="UTF-8" ?>
<user xmlns:th="http://www.thymeleaf.org">
      <username th:text="${username}">花千骨</username>
    <age th:text="${age}">32</age>   
</user>
View Code

我这里最终生成的 user自动发布文件.xml 和这里的html页面内容一致,只不过是里面的数据被替换了。

 

转载于:https://www.cnblogs.com/shiyun32/p/10771815.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值