首页 > 编程语言 >利用XSLT及C#.net将SVG转换为XAML

利用XSLT及C#.net将SVG转换为XAML

时间:2023-02-28 11:05:00浏览次数:48  
标签:ofd XSLT C# SVG XAML new xsl


在网上找到了一个名为SVG-Convert-Driver-XAML-0.02的开源代码, 解压缩之后发现,它并不是使用.net代码写的, 所以并不适合我的需要。

不过,里面有一个文件却是非常有用的,那就是:解压目录/SVG-Convert-Driver-XAML-0.02/lib/SVG/Convert/Driver/XAML/svg2xaml.xsl。由于XSLT文件中还引用到一个名为colors.xml的文件,但原作者给出的压缩包中并没有这个文件。于是,我只好顺藤摸瓜,根据此XSLT中的XPath,来推断此colors.xml的结构。根据svg2xaml.xsl第71行这句:

<xsl:variable name="named_color_hex" select="document('colors.xml')/colors/color[@name = translate($colorspec, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')]/@hex" />
经过分析,我推测出这个colors.xml的结构大致应该是这样:
<colors>
<color name="aliceblue" hex="F0F8FF" .... />
<!-- 更多的color元素及其属性 -->
</colors>

我现在要用它来写将SVG转换成XAML。 


先看看写出完整程序之后的最终运行的效果图:


利用XSLT及C#.net将SVG转换为XAML_xsl




制作程序的过程:

于是在网上搜索colors.xml,还真找到一个类似的文件。它的结构是:

<?xml versinotallow="1.0" encoding="UTF-8"?>
<colors>
<color name="aliceblue" hex="F0F8FF" hsl="208,14,240" rgb="240,248,255" />
<color name="antiquewhite" hex="FAEBD7" hsl="34,34,235" rgb="250,235,215" />
<color name="aqua" hex="00FFFF" hsl="180,240,240" inversename="red" rgb="0,255,255" />
<color name="aquamarine" hex="7FFFD4" hsl="160,120,240" rgb="127,255,212" />
<!-- 更多color元素 -->
<color name="yellowgreen" hex="9ACD32" hsl="80,181,193" rgb="154,205,50" />
</colors>

剩下的工作就是将SVG文件用弹出对话框打开, 然后使用XslCompiledTransform,XsltSettings, XmlReaderSettings将此文件转换成XAML了。
 

OpenFileDialog ofd = new OpenFileDialog();
ofd.Filter = "*.svg|*.svg";
ofd.ShowDialog();
if (ofd.FileName != string.Empty)
{
StringWriter sw = new StringWriter();
XmlWriter xmlWriter = new XmlTextWriter(sw);
try
{
using (StreamReader streamReader = new StreamReader(ofd.FileName))
{
txtBoxSVGCode.Text = streamReader.ReadToEnd();
}
}
catch (Exception exc)
{
System.Windows.MessageBox.Show(string.Format("出错了,错误是:/r/n{0}", exc.Message));
}

string untrustedUri = @"​​​http://www.anuntrustedsite.com/test.xsl​​​";
XmlResolver resolver = new XmlSecureResolver(new XmlUrlResolver(), untrustedUri);
XsltSettings settings = XsltSettings.TrustedXslt;
settings.EnableDocumentFunction = true;
XslCompiledTransform transform = new XslCompiledTransform();
transform.Load(@"../svg2xaml.xsl", settings, new XmlUrlResolver());
XmlReaderSettings rs = new XmlReaderSettings();
rs.ProhibitDtd = false;
transform.Transform(XmlReader.Create(ofd.FileName, rs), null, xmlWriter, resolver);
xmlWriter.Close();
// 这里是显示最终结果图形的代码(略)
}

在调试中发现,上面的程序对于有些SVG可以进行非常正常的转换,但有些却无法转换,抛出异常。比如说打开svg2xaml.xsl处第71行异常等。但这个XSLT文件经过我多次检测,没有格式方面的问题。还有对有些SVG文件转换速度很慢,特别是有路径内嵌的情况时更是如此——初步估计与XSLT模版中的某些算法有关系。

有空再找找相关的原因吧,我这里重点讲述转换的方法,希望对你有所启迪。

标签:ofd,XSLT,C#,SVG,XAML,new,xsl
From: https://blog.51cto.com/JohnsonJu/6090437

相关文章

  • ACCESS中使用GUID全局唯一标识符的自动唯一编号[同步复制ID]之解决方法
    背景:这段时间临时为一个旅游类网站制作一些网站程序。数据表的情况大致如下:图1数据库表的大致情况由于是Access数据库,之前有两个数据表:TC_TourCompany和TC_SubDetail,前......
  • 华为LAB实验室3-机器学习实验:(线性回归)美国King County房价预测训练赛
    各位好,我是乾颐堂大堂子。领取完整实战指南可以私信我,关键词:实战指南1.导入相关python库2.数据处理下载的是两个数据文件,一个是真实数据,一个是测试数据,打开kc_train.csv,能够......
  • 导出/打印Access数据库的结构
    因为工作需要,现想将ACCESS数据库的所有表的结构及相关说明生成WORD文档并打印出来。比如下图:图一数据表及其说明性文字(留意深橙色矩形部分)图二Access表的结构及其字段说明......
  • C#中使用GDI+绘制辉光效果文字
    问题在这里:​@Tofer_ba:-------------------------//http://www..com版权所有,勿作商用-------------------------usingSystem;usingSystem.Drawing;usingSystem.Draw......
  • 用实例讲DynamicResource与StaticResource的区别
    之前我的博客文章"​​WPF中的资源(Resource)​​"中概略性地提到过DynamicResource与StaticResource的区别。其中有这么一句,确切地说是两句:静态资源在第一次编译后即确定其对......
  • ATC:一个能将主流开源框架模型转换为昇腾模型的神奇工具
    摘要:本文介绍了昇腾CANN提供的模型转换工具ATC,介绍了其功能、架构,并以具体样例介绍了该工具的基本使用方法以及常用设置。本文分享自华为云社区《使用ATC工具将主流开源框......
  • centos7的密码安全策略加固
    centos7操作系统在CentOS 7上实现密码复杂度策略设置一.使用login.defs文件解析:/etc/login.defs是设置新建用户帐号限制的文件。该文件里的配置对root用户无效。/etc......
  • Websocket 60秒断开,连接不稳定
    本地测试都是正常的,线上测试总是过一会就断开...线上新增了https协议,导致页面中的链接必须也是sslWebsocket链接地址从ws://ws.xxx.com改成了wss://ws.xxx.com最开始htt......
  • Codeforces Round #776 (Div
    CodeforcesRound#776(Div.3)CodeForces-1650DTwistthePermutation给定你数组a:123...n,一共有n次操作,每次操作可以把\(a_i\)移到最左边,然后对\(i+1\)位以......
  • 阿里前端二面常考react面试题(必备)
    说说React组件开发中关于作用域的常见问题。在EMAScript5语法规范中,关于作用域的常见问题如下。(1)在map等方法的回调函数中,要绑定作用域this(通过bind方法)。(2)父组件传递......