程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> C#通過IronRuby分析YAML

C#通過IronRuby分析YAML

編輯:C#入門知識

Yaml是一種不錯的格式,無論是作為配置文件還是小量數據的存儲都是一種不錯的選擇。ruby和它結合的比較好,但是其它語言,目前的parser還不完善。
C#就沒有比較好的Yaml的Parser,在nuGet上找了半天,找到一個parse,但是貌似有問題,yaml文件縮進一定要兩個空格,不能是Tab,我狂暈。

後來自己想了一個辦法來解決這個問題。就是C#調用用IronRuby來解析,然後再返回給C#。因為IronRuby完美的實現了Ruby 1.9的大部分,用它來分析Yaml應該是比較合適的。

新建一個工程YLab.Yaml 加入對Ironruby的dll的引用 下載了ironruby就知道了引用哪些了


建立一個文件夾YLab.Yaml

下面建立一個config.rb文件

# 作者 虞  # 時間 2011-6-6  # Path 變量定義了IronRuby的SearchPath  # rb文件中的require就是在SearchPath中查找的  # 這裡的路徑都是相對於應用程序根目錄的相對路徑 

Path = 

[     

"RubyLib/ironruby",          

"RubyLib/ruby/1.9.1",    

 "RubyLib/ruby/site_ruby/1.9.1"

 ]  

 def SearchPath      

 Path

end
 

 再建立一個YLabYAML.rb文件

 

# 作者 虞  # 時間 2011-6-6 

require "yaml"  

class YYAML      

 def load(file)            

YAML::load_file(file)      

 end        

def parse(file)            

 YAML::parse_file(file)     

 end

end
 然後是YAML.cs文件

 

 

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5
 6 using System.IO;
 7
 8 using Microsoft.Scripting.Hosting;
 9 using IronRuby;
10
11 namespace YLab.YAML
12 {
13     public class YAML
14     {
15         private ScriptRuntime irb;
16         private ICollection<string> searchPath = new List<string>();
17         private dynamic yyaml;
18
19         public YAML()
20         {
21             irb = Ruby.CreateRuntime();
22             searchPath.Add(System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory));
23             searchPath.Add(System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, @"YLab.YAML"));
24             irb.GetRubyEngine().SetSearchPaths(searchPath);
25
26             dynamic rbCfg = irb.UseFile("config.rb");
27             var cfgSearchPath = rbCfg.SearchPath();
28             foreach (var path in cfgSearchPath)
29             {
30                 searchPath.Add(System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, (string)path));
31             }
32             irb.GetRubyEngine().SetSearchPaths(searchPath);
33             //ylabYAML = irb.UseFile("YLabYAML.rb");
34
35             var assembly = System.Reflection.Assembly.GetExecutingAssembly();
36
37             string code;
38
39             using (var stream = assembly.GetManifestResourceStream("YLab.YAML.YLab.YAML.YLabYAML.rb"))
40             {
41                 using (TextReader rbReader = new StreamReader(stream)) {
42                     code = rbReader.ReadToEnd();
43                 }
44             }
45             irb.GetRubyEngine().Execute(code);
46 //            irb.GetRubyEngine().Execute(@"
47 //                # 作者 虞
48 //                # 時間 2011-6-6
49 //                require yaml
50 //                class YYAML
51 //                    def load(file)
52 //                        YAML::load_file(file)
53 //                    end
54 //
55 //                    def parse(file)
56 //                        YAML::parse_file(file)
57 //                    end
58 //                end
59 //            ");
60
61             dynamic ruby = irb.Globals;
62             yyaml = ruby.YYAML.@new();
63
64         }
65
66         public dynamic LoadFile(string yamlFile)
67         {
68             return yyaml.load(yamlFile);
69
70         }
71
72         public dynamic ParseFile(string yamlFile)
73         {
74             return yyaml.parse(yamlFile);
75         }
76     }
77 }
這樣就可以了


再建立一個consoleapp

先放一個要分析的yaml config.ya

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved