Java学习:使用StAX写XML - 绘制中国国旗的SVG文件

本文是我在学习《Java核心技术》第九版卷II(高级特性)时写的一段代码。原书作者为(美)Cay S. Horstmann,Gary Cornell,译者为陈昊鹏、王浩、姚建平等。我的Java版本为1.8

之前写过一个Blog,使用DOM写XML绘制中国国旗:

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

下面代码也可以绘制出一个SVG格式的中华人民共和国国旗,但使用的是StAX。

SVG文件参考了维基百科上的中国国旗SVG文件。

(https://zh.wikipedia.org/wiki/中华人民共和国国旗#/media/File:Flag_of_the_People's_Republic_of_China.svg)

Java代码如下:

package XmlGenerateTest;

import java.io.File;
import java.io.IOException;
import java.io.OutputStream;
import java.nio.file.Files;

import javax.xml.stream.XMLOutputFactory;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamWriter;

/**
 * 使用StAX绘制中国国旗的SVG文件
 * @author Tsybius2014
 * @date 2015年12月13日
 * @time 下午7:27:11
 * @remark
 *
 */
class XmlGenerateTest {

    /**
     * 使用StAX绘制中国国旗的SVG文件
     * 
     * @param args
     */
    public static void main(String[] args) {

        try {
            File file = new File("C:\\Users\\Tsybius\\Desktop\\FlagOfPRC.svg");
            OutputStream out = Files.newOutputStream(file.toPath());
            XMLOutputFactory factory = XMLOutputFactory.newInstance();
            XMLStreamWriter writer = factory.createXMLStreamWriter(out);
            writer.writeStartDocument();
            writer.writeStartElement("svg");
            writer.writeAttribute("xmlns", "http://www.w3.org/2000/svg"); // svg
            writer.writeAttribute("xmlns:xlink", "http://www.w3.org/1999/xlink"); // svg
            writer.writeAttribute("width", "900"); // svg
            writer.writeAttribute("height", "600"); // svg
            writer.writeAttribute("viewBox", "0 0 30 20"); // svg
            writer.writeStartElement("defs");
            writer.writeStartElement("path");
            writer.writeAttribute("id", "s"); // path
            writer.writeAttribute("d",
                "M0,-1 0.587785,0.809017 -0.951057,-0.309017H0.951057L-0.587785,0.809017z");
            writer.writeAttribute("fill", "#ffde00"); // path
            writer.writeEndElement(); // End of path
            writer.writeEndElement(); // End of defs
            writer.writeStartElement("rect");
            writer.writeAttribute("width", "30"); // rect
            writer.writeAttribute("height", "20"); // rect
            writer.writeAttribute("fill", "#de2910"); // rect
            writer.writeEndElement(); // End of rect
            writer.writeStartElement("use");
            writer.writeAttribute("xlink:href", "#s"); // use1
            writer.writeAttribute("transform", "translate(5,5) scale(3)"); // use1
            writer.writeEndElement(); // End of use1
            writer.writeStartElement("use");
            writer.writeAttribute("xlink:href", "#s"); // use2
            writer.writeAttribute("transform",
                "translate(10,2) rotate(23.036243)"); // use2
            writer.writeEndElement(); // End of use2
            writer.writeStartElement("use");
            writer.writeAttribute("xlink:href", "#s"); // use3
            writer.writeAttribute("transform",
                "translate(12,4) rotate(45.869898)"); // use3
            writer.writeEndElement(); // End of use3
            writer.writeStartElement("use");
            writer.writeAttribute("xlink:href", "#s"); // use4
            writer.writeAttribute("transform",
                "translate(12,7) rotate(69.945396)"); // use4
            writer.writeEndElement(); // End of use4
            writer.writeStartElement("use");
            writer.writeAttribute("xlink:href", "#s"); // use5
            writer.writeAttribute("transform",
                "translate(10,9) rotate(20.659808)"); // use5
            writer.writeEndElement(); // End of use5
            writer.writeEndElement(); // End of svg
            writer.writeEndDocument();
            writer.close();
            out.close();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (XMLStreamException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        System.out.println("END");
    }
}

生成的SVG文件FlagOfPRC.svg,经格式化后如下:

<?xml version="1.0" encoding="utf-8"?>

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

(注:XML在线格式化可使用此工具: http://tool.oschina.net/codeformat/xml  )

使用Firefox打开此文件效果如下:

Java学习:使用StAX写XML - 绘制中国国旗的SVG文件_第1张图片

END

你可能感兴趣的:(java,xml,svg,StAX,中国国旗)