文档章节

Xembly学习(二):Xembly脚本基本语法与几个XML生成实例

北风其凉
 北风其凉
发布于 2016/02/15 21:04
字数 2013
阅读 60
收藏 0
点赞 1
评论 0

Xembly是一个类似汇编语言的命令式语言,可以用来操作XML文档。本文给出了Xembly从下载、编译、运行示例的详细方法。我电脑中的操作系统为 Windows7家庭普通版(Service Pack 1),JDK版本为jdk1.8,Eclipse版本为Luna Service Release 1 (4.4.1)。

Xembly的下载、编译步骤,可以参考我的上一篇Blog:

http://my.oschina.net/Tsybius2014/blog/614784

一、Xembly的语法

Xembly是一种命令式语言,它的语法类似于汇编语法,下面列出了Xembly的命令

1、ADD:在当前节点下新增一个新节点,游标(cursor)同时跟进到该节点

2、ADDIF:在当前节点下如果不存在指定名称的节点则新增一个新节点,游标同时跟进到该节点,本语句对大小写敏感

3、SET:使用指定文本修改节点值,不改变游标位置

4、XSET:使用指定XPath表达式修改节点值,不改变游标位置

5、ATTR:设置属性

6、UP:将游标移动到上级节点

7、XPATH:移动游标到指定XPath表达式位置

8、REMOVE:移除当前节点,并将游标重新指向父节点

9、STRICT:检查当前节点下的节点数是否与指定数字相符,不相符则提示异常,本语句不改变指针位置

10、PI:添加XML首部处理指令(processing instruction)

11、PUSH:将当前位置压入栈中

12、POP:从堆栈中取出第一个位置并跳转到该位置

13、NS:为指定节点添加命名空间

详情可见页面 https://github.com/yegor256/xembly 下Readme.MD文件的描述

二、执行Xembly脚本

为了执行Xembly脚本,我写了一个Java程序,代码如下:

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

import org.xembly.Directives;
import org.xembly.Xembler;

public class XemblyTester {
    public static void main(String[] args) {

        String scriptPath = "C:\\Users\\Tsybius\\Desktop\\XemblyScript\\America.xembly";
        String outputPath = "C:\\Users\\Tsybius\\Desktop\\XemblyScript\\America.xml";

        GenXmlByXembly(scriptPath, outputPath);
    }

    public static void GenXmlByXembly(String scriptPath, String outputPath) {
        try {
            String script = ""; // 用来保存每行读取的内容
            StringBuilder buffer = new StringBuilder();
            InputStream is = new FileInputStream(scriptPath);
            String line;
            BufferedReader reader = new BufferedReader(
                new InputStreamReader(is));
            line = reader.readLine();
            while (line != null) {
                buffer.append(line);
                buffer.append("\n");
                line = reader.readLine();
            }
            script = buffer.toString();
            reader.close();
            is.close();

            System.out.println("读取到Xembly代码");
            System.out.println(script);

            String xml = new Xembler(new Directives(script)).xml();

            System.out.println("生成的XML文件");
            System.out.println(xml);
            
            BufferedWriter bufferedWriter  = null;
            File file = new File(outputPath);
            bufferedWriter = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file), "UTF-8"));
            bufferedWriter.append(xml);
            bufferedWriter.flush();
            bufferedWriter.close();
            
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

其中scriptPath变量用于指定Xembly脚本的路径,outputPath变量用于指定生成后的XML保存到的路径

三、示例1:生成法国国旗的SVG图像

法国国旗是三色旗,它的SVG图像比较容易绘制,它的绘制脚本France.xembly如下:

ADD "svg";
ATTR "xmlns", "http://www.w3.org/2000/svg";
ATTR "width", "900";
ATTR "height", "600";
ADD "rect";
ATTR "width", "900";
ATTR "height", "600";
ATTR "fill", "#ED2939";
UP;
ADD "rect";
ATTR "width", "600";
ATTR "height", "600";
ATTR "fill", "#fff";
UP;
ADD "rect";
ATTR "width", "300";
ATTR "height", "600";
ATTR "fill", "#002395";

生成的SVG文件France.svg如下:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg xmlns="http://www.w3.org/2000/svg" height="600" width="900">
<rect fill="#ED2939" height="600" width="900"/>
<rect fill="#fff" height="600" width="600"/>
<rect fill="#002395" height="600" width="300"/>
</svg>

将生成的SVG文件用浏览器打开,就可以看到效果了。本文中的列举的5个国旗的SVG文件,都参考了Wikipedia上各国国旗的SVG文件。

四、示例2:生成俄罗斯国旗的SVG图像

俄罗斯国旗也是三色旗,它的SVG图像绘制方法与法国国旗类似,脚本Russia.xembly如下:

ADD "svg";
ATTR "xmlns", "http://www.w3.org/2000/svg";
ATTR "viewBox", "0 0 9 6";
ATTR "width", "900";
ATTR "height", "600";
ADD "rect";
ATTR "fill", "#fff";
ATTR "width", "9";
ATTR "height", "3";
UP;
ADD "rect";
ATTR "fill", "#d52b1e";
ATTR "y", "3";
ATTR "width", "9";
ATTR "height", "3";
UP;
ADD "rect";
ATTR "fill", "#0039a6";
ATTR "y", "2";
ATTR "width", "9";
ATTR "height", "2";

生成的SVG文件Russia.svg如下:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg xmlns="http://www.w3.org/2000/svg" height="600" viewBox="0 0 9 6" width="900">
<rect fill="#fff" height="3" width="9"/>
<rect fill="#d52b1e" height="3" width="9" y="3"/>
<rect fill="#0039a6" height="2" width="9" y="2"/>
</svg>

五、示例3:生成中国国旗的SVG图像

中国国旗是五星红旗,需要绘制五颗不同角度的星星,脚本China.xembly如下:

ADD "svg";
ATTR "xmlns", "http://www.w3.org/2000/svg";
ATTR "xmlns:xlink", "http://www.w3.org/1999/xlink";
ATTR "width", "900";
ATTR "height", "600";
ATTR "viewBox", "0 0 30 20";
PUSH;
ADD "defs";
ADD "path";
ATTR "id", "s";
ATTR "d", "M0,-1 0.587785,0.809017 -0.951057,-0.309017H0.951057L-0.587785,0.809017z";
ATTR "fill", "#ffde00";
POP;
ADD "rect";
ATTR "width", "30";
ATTR "height", "20";
ATTR "fill", "#de2910";
UP;
ADD "use";
ATTR "xlink:href", "#s";
ATTR "transform", "translate(5,5) scale(3)";
UP;
ADD "use";
ATTR "xlink:href", "#s";
ATTR "transform", "translate(10,2) rotate(23.036243)";
UP;
ADD "use";
ATTR "xlink:href", "#s";
ATTR "transform", "translate(12,4) rotate(45.869898)";
UP;
ADD "use";
ATTR "xlink:href", "#s";
ATTR "transform", "translate(12,7) rotate(69.945396)";
UP;
ADD "use";
ATTR "xlink:href", "#s";
ATTR "transform", "translate(10,9) rotate(20.659808)";

生成的SVG文件China.svg如下:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" height="600" viewBox="0 0 30 20" width="900">
<defs>
<path d="M0,-1 0.587785,0.809017 -0.951057,-0.309017H0.951057L-0.587785,0.809017z" fill="#ffde00" id="s"/>
</defs>
<rect fill="#de2910" height="20" width="30"/>
<use transform="translate(5,5) scale(3)" xlink:href="#s"/>
<use transform="translate(10,2) rotate(23.036243)" xlink:href="#s"/>
<use transform="translate(12,4) rotate(45.869898)" xlink:href="#s"/>
<use transform="translate(12,7) rotate(69.945396)" xlink:href="#s"/>
<use transform="translate(10,9) rotate(20.659808)" xlink:href="#s"/>
</svg>

六、示例4:生成英国国旗的SVG图像

英国国旗是米字旗,需要建立一个clipPath,然后按照蓝底背景、白色斜十字、红色斜十字、白色十字、红色十字的顺序绘制,脚本Bratain.xembly如下:

ADD "svg";
ATTR "xmlns", "http://www.w3.org/2000/svg";
ATTR "viewBox", "0 0 60 30";
ATTR "width", "1200";
ATTR "height", "600";
PUSH;
ADD "clipPath";
ATTR "id", "t";
ADD "path";
ATTR "d", "M30,15 h30 v15 z v15 h-30 z h-30 v-15 z v-15 h30 z";
POP;
ADD "path";
ATTR "d", "M0,0 v30 h60 v-30 z";
ATTR "fill", "#00247d";
UP;
ADD "path";
ATTR "d", "M0,0 L60,30 M60,0 L0,30";
ATTR "stroke", "#fff";
ATTR "stroke-width", "6";
UP;
ADD "path";
ATTR "d", "M0,0 L60,30 M60,0 L0,30";
ATTR "clip-path", "url(#t)";
ATTR "stroke", "#cf142b";
ATTR "stroke-width", "4";
UP;
ADD "path";
ATTR "d", "M30,0 v30 M0,15 h60";
ATTR "stroke", "#fff";
ATTR "stroke-width", "10";
UP;
ADD "path";
ATTR "d", "M30,0 v30 M0,15 h60";
ATTR "stroke", "#cf142b";
ATTR "stroke-width", "6";

生成的SVG文件Britain.svg如下:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg xmlns="http://www.w3.org/2000/svg" height="600" viewBox="0 0 60 30" width="1200">
<clipPath id="t">
<path d="M30,15 h30 v15 z v15 h-30 z h-30 v-15 z v-15 h30 z"/>
</clipPath>
<path d="M0,0 v30 h60 v-30 z" fill="#00247d"/>
<path d="M0,0 L60,30 M60,0 L0,30" stroke="#fff" stroke-width="6"/>
<path clip-path="url(#t)" d="M0,0 L60,30 M60,0 L0,30" stroke="#cf142b" stroke-width="4"/>
<path d="M30,0 v30 M0,15 h60" stroke="#fff" stroke-width="10"/>
<path d="M30,0 v30 M0,15 h60" stroke="#cf142b" stroke-width="6"/>
</svg>

七、示例5:生成美国国旗的SVG图像

美国的星条旗较难绘制,最难的部分在于左上角的51颗星星,脚本America.xembly如下:

ADD "svg";
ATTR "xmlns", "http://www.w3.org/2000/svg";
ATTR "xmlns:xlink", "http://www.w3.org/1999/xlink";
ATTR "width", "1235";
ATTR "height", "650";
ATTR "viewBox", "0 0 7410 3900";
ADD "rect";
ATTR "width", "7410";
ATTR "height", "3900";
ATTR "fill", "#b22234";
UP;
ADD "path";
ATTR "d", "M0,450H7410m0,600H0m0,600H7410m0,600H0m0,600H7410m0,600H0";
ATTR "stroke", "#fff";
ATTR "stroke-width", "300";
UP;
ADD "rect";
ATTR "width", "2964";
ATTR "height", "2100";
ATTR "fill", "#3c3b6e";
UP;
ADD "g";
ATTR "fill", "#fff";
PUSH;
ADD "g";
ATTR "id", "s18";
PUSH;
ADD "g";
ATTR "id", "s9";
PUSH;
ADD "g";
ATTR "id", "s5";
PUSH;
ADD "g";
ATTR "id", "s4";
ADD "path";
ATTR "id", "s";
ATTR "d", "M247,90 317.534230,307.082039 132.873218,172.917961H361.126782L176.465770,307.082039z";
UP;
ADD "use";
ATTR "xlink:href", "#s";
ATTR "y", "420";
UP;
ADD "use";
ATTR "xlink:href", "#s";
ATTR "y", "840";
UP;
ADD "use";
ATTR "xlink:href", "#s";
ATTR "y", "1260";
POP;
ADD "use";
ATTR "xlink:href", "#s";
ATTR "y", "1680";
POP;
ADD "use";
ATTR "xlink:href", "#s4";
ATTR "x", "247";
ATTR "y", "210";
POP;
ADD "use";
ATTR "xlink:href", "#s9";
ATTR "x", "494";
POP;
ADD "use";
ATTR "xlink:href", "#s18";
ATTR "x", "988";
UP;
ADD "use";
ATTR "xlink:href", "#s9";
ATTR "x", "1976";
UP;
ADD "use";
ATTR "xlink:href", "#s5";
ATTR "x", "2470";

生成的SVG文件America.svg如下:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" height="650" viewBox="0 0 7410 3900" width="1235">
<rect fill="#b22234" height="3900" width="7410"/>
<path d="M0,450H7410m0,600H0m0,600H7410m0,600H0m0,600H7410m0,600H0" stroke="#fff" stroke-width="300"/>
<rect fill="#3c3b6e" height="2100" width="2964"/>
<g fill="#fff">
<g id="s18">
<g id="s9">
<g id="s5">
<g id="s4">
<path d="M247,90 317.534230,307.082039 132.873218,172.917961H361.126782L176.465770,307.082039z" id="s"/>
<use xlink:href="#s" y="420"/>
<use xlink:href="#s" y="840"/>
<use xlink:href="#s" y="1260"/>
</g>
<use xlink:href="#s" y="1680"/>
</g>
<use x="247" xlink:href="#s4" y="210"/>
</g>
<use x="494" xlink:href="#s9"/>
</g>
<use x="988" xlink:href="#s18"/>
<use x="1976" xlink:href="#s9"/>
<use x="2470" xlink:href="#s5"/>
</g>
</svg>

END

© 著作权归作者所有

共有 人打赏支持
北风其凉

北风其凉

粉丝 114
博文 493
码字总数 462457
作品 4
朝阳
程序员
Xembly学习(一):Xembly的编译与调用

Xembly是一个类似汇编语言的命令式语言,可以用来操作XML文档。本文给出了Xembly从下载、编译、运行示例的详细方法。我电脑中的操作系统为Windows7家庭普通版(Service Pack 1),JDK版本为j...

北风其凉 ⋅ 2016/02/14 ⋅ 0

XML 的汇编语言--Xembly

Xembly 是一个用来操作 XML 文档的类似汇编语言的语法工具,比 XSLT 和 XQuery 要简单很多。 例如下面一个 Xembly 的脚本: XPATH '/root';ADDIF 'orders';ADD 'order';ATTR 'id', '55';ADD...

红薯 ⋅ 2014/11/22 ⋅ 2

Xembly —— 汇编语言风格指令操作 XML 文档

Xembly 是一个用来操作 XML 文档的类似汇编语言的语法工具,比 XSLT 和 XQuery 要简单很多。

oschina ⋅ 2014/11/22 ⋅ 0

OSChina 技术周刊第十期,每周技术抢先看!

每周技术抢先看,总有你想要的! 移动开发 【软件】Android 表单验证框架 - AValidations 【软件】Git@OSC 的 iPhone 客户端 【软件】Git@OSC 的 Android 客户端 【博客】使用gradle构建and...

OSC编辑部 ⋅ 2014/11/24 ⋅ 10

DWR框架简单实例

1、从DWR官网下载最新版本的jar包,地址:http://directwebremoting.org/dwr/downloads/index.html 2、将jar包放入WEB-INF的lib文件夹下。同时,dwr依赖于commons-logging.jar这个包,所以必...

若有思无 ⋅ 2015/01/12 ⋅ 4

Android Studio自定义模板 写页面竟然可以如此轻松

本文已授权微信公众号:鸿洋(hongyangAndroid)在微信公众号平台原创首发。 转载请标明出处: http://blog.csdn.net/lmj623565791/article/details/51635533; 本文出自:【张鸿洋的博客】 ...

lmj623565791 ⋅ 2016/06/12 ⋅ 0

Lua1.1 程序分析二

再看看另外的几个自带的程序,简单的分析一下。 test 目录里有几个 Lua 程序,其中 sort 子目录里又有两个 Lua 程序(这两个和外面的 sort.lua 差不多)。 先看下 sort 目录里面的: q.lua,...

晓寒 ⋅ 2014/09/09 ⋅ 0

Android中使用SVG实现炫酷动画效果

前言 SVG,即Scalable Vector Graphics 可伸缩矢量图形。这种图像格式在前端中已经使用的非常广泛,而在移动端的开发中,遇到一些复杂的自定义控件或者动画效果,我们就可以考虑使用SVG。 一...

SilenceOO ⋅ 2017/11/27 ⋅ 0

shell脚本学习(二)

linux-Bash 脚本编辑 编辑语言的类型 解释型语言(Bash Python perl) 定义: 通过解释器来读入我们编写的代码,将其转换为系统相关命令。 执行优点: 可以很容易处理像文件或者目录这样的对...

hu小贱 ⋅ 2014/11/08 ⋅ 0

C# WinForm开发系列 - XML/XSLT/XPATH

XML在WinForm, Asp.Net, Java, AJAX开发等方面应用, 以及对XML文档基本操作,如XPath检索节点. 当前XML被广泛应用与配置保存, 简单数据存储, 跨平台数据传输, 其身影活跃于Web Services, AJA...

长征2号 ⋅ 2017/07/09 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

PHP语言系统ZBLOG或许无法重现月光博客的闪耀历史[图]

最近在写博客,希望通过自己努力打造一个优秀的教育类主题博客,名动江湖,但是问题来了,现在写博客还有前途吗?面对强大的自媒体站点围剿,还有信心和可能型吗? 至于程序部分,我选择了P...

原创小博客 ⋅ 3分钟前 ⋅ 0

IntelliJ IDEA 2018.1新特性

工欲善其事必先利其器,如果有一款IDE可以让你更高效地专注于开发以及源码阅读,为什么不试一试? 本文转载自:netty技术内幕 3月27日,jetbrains正式发布期待已久的IntelliJ IDEA 2018.1,再...

Romane ⋅ 29分钟前 ⋅ 0

浅谈设计模式之工厂模式

工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 在工厂模式中,我们在创建对象时不会对客户端暴露创建逻...

佛系程序猿灬 ⋅ 55分钟前 ⋅ 0

Dockerfile基础命令总结

FROM 指定使用的基础base image FROM scratch # 制作base image ,不使用任何基础imageFROM centos # 使用base imageFROM ubuntu:14.04 尽量使用官方的base image,为了安全 LABEL 描述作...

ExtreU ⋅ 昨天 ⋅ 0

存储,对比私有云和公有云的不同

导读 说起公共存储,很难不与后网络公司时代的选择性外包联系起来,但尽管如此,它还是具备着简单和固有的可用性。公共存储的名字听起来也缺乏专有性,很像是把东西直接堆放在那里而不会得到...

问题终结者 ⋅ 昨天 ⋅ 0

C++难点解析之const修饰符

C++难点解析之const修饰符 c++ 相比于其他编程语言,可能是最为难掌握,概念最为复杂的。结合自己平时的C++使用经验,这里将会列举出一些常见的难点并给出相应的解释。 const修饰符 const在c...

jackie8tao ⋅ 昨天 ⋅ 0

聊聊spring cloud netflix的HystrixCommands

序 本文主要研究一下spring cloud netflix的HystrixCommands。 maven <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-clo......

go4it ⋅ 昨天 ⋅ 0

Confluence 6 从其他备份中恢复数据

一般来说,Confluence 数据库可以从 Administration Console 或者 Confluence Setup Wizard 中进行恢复。 如果你在恢复压缩的 XML 备份的时候遇到了问题,你还是可以对整个站点进行恢复的,如...

honeymose ⋅ 昨天 ⋅ 0

myeclipse10 快速搭建spring boot开发环境(入门)

1.创建一个maven的web项目 注意上面标红的部分记得选上 2.创建的maven目录结构,有缺失的目录可以自己建立目录补充 补充后 这时候一个maven的web项目创建完成 3.配置pom.xml配置文件 <proje...

小海bug ⋅ 昨天 ⋅ 0

nginx.conf

=========================================================================== nginx.conf =========================================================================== user nobody; #......

A__17 ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部