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

116 篇文章 9 订阅
27 篇文章 0 订阅

在网上找到了一个名为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。 

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

SVG代码转换为XAML代码的运行界面图


制作程序的过程:

于是在网上搜索colors.xml,还真找到一个类似的文件。它的结构是:
<?xml version="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模版中的某些算法有关系。

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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
C#中,你可以使用`System.Xml`命名空间中的类来将XML转换为文本。以下是一个示例代码: ```csharp using System; using System.IO; using System.Xml; using System.Xml.Xsl; public class XmlToTextConverter { public static void Main(string[] args) { // 加载XML文件 XmlDocument xmlDoc = new XmlDocument(); xmlDoc.Load("input.xml"); // 加载XSLT样式表 XslCompiledTransform xslt = new XslCompiledTransform(); xslt.Load("transform.xsl"); // 创建StringWriter来保存转换结果 StringWriter textWriter = new StringWriter(); // 执行转换并将结果写入StringWriter xslt.Transform(xmlDoc, null, textWriter); // 输出转换结果 string outputText = textWriter.ToString(); Console.WriteLine(outputText); // 保存转换结果到文件 File.WriteAllText("output.txt", outputText); } } ``` 在上面的示例中,假设你的XML文件名为`input.xml`,XSLT样式表文件名为`transform.xsl`。代码将XML文件加载到一个XmlDocument实例中,然后将XSLT样式表加载到一个XslCompiledTransform实例中。接下来,创建一个StringWriter对象,用于保存转换后的文本结果。调用`xslt.Transform()`方法将XML转换为文本,并将结果写入StringWriter。最后,可以通过调用StringWriter的`ToString()`方法将转换结果作为字符串获取。你可以根据需要输出到控制台或保存到文件。 请确保将文件路径替换为实际的XML文件和XSLT样式表文件的路径。执行上述代码后,将在控制台或`output.txt`文件中看到XML转换为文本的结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值