2011-07-15 2 views
0

特定の形式のテキストファイルからVB.netまたはC#ソースファイルにコードを生成する方法を知りたいと思います。例えば :テキストファイルまたはXMLファイルからコードを自動的に生成してコンパイルしますか?

<category1> 
     <subcategory> 
     entry1 
     entry2 
     </subcategory> 
</Category1> 

そしてvb.netのコード(またはC#)を生成します:

Dim TreeNode1 As System.Windows.Forms.TreeNode = New System.Windows.Forms.TreeNode("entry1") 
Dim TreeNode2 As System.Windows.Forms.TreeNode = New System.Windows.Forms.TreeNode("entry2") 
Dim TreeNode3 As System.Windows.Forms.TreeNode = New System.Windows.Forms.TreeNode("subcategory", New System.Windows.Forms.TreeNode() {TreeNode1, TreeNode2}) 

アイデアがある私は、次のフォーマットを持つテキストファイルを読むために私のコード生成プログラムを希望ユーザがtxtファイルを変更してコード生成プログラムを使用した後でメインコードをコンパイルする。私はC、PythonまたはC#でプログラムを生成するコードを書くことを好むでしょう。 どうすればこの問題を解決できますか?

答えて

1

は、問題のタグと最後から二番目の文にもかかわらず、Pythonの質問ですが、ここではPythonの答えです。

>>> from xml.etree import ElementTree as etree 
>>> corpus = '''<category1> 
...  <subcategory> 
...   entry1 
...   entry2 
...  </subcategory> 
... </category1> 
... ''' 
>>> doc = etree.fromstring(corpus) 
>>> for subcategory in doc.getchildren(): 
...  for entry in filter(bool, 
...       map(str.strip, 
...        subcategory.text.split('\n'))): 
...   print "entry output: (%s)" % entry 
...  print "subcategory output (%s)" % subcategory.tag 
... 
entry output: (entry1) 
entry output: (entry2) 
subcategory output (subcategory) 
>>> 
0

テキストファイルを解析するためにパーサーを作成する必要があります。パーサーがVB.netやC#コードに似た文字列を生成すると、Emitを使用して一時アセンブリにコンパイルすることができます

0

CSharpCodeProviderを使用して残りのクラスの文字列スケルトンを設定し、生成されたコードを正しい場所に挿入します。あなたはメモリ内に構築したいとfalseに実行可能な構築設定します

Info about the CSharpCodeProvider

注意。 Hereは、その実行方法の例であり、現在実行中のファイルのアセンブリへのコンパイラのアセンブリの設定方法も示しています。

これは少し曖昧ですが、実際のCSharpCodeProviderを設定する方法は、何をしようとしているかによって異なります。また、FileNotFound例外がコンパイルエラーを受け取った場合、トップリンクは読み込み可能な方法でそれらをスローするための素晴らしい解決策を提供します。

0

これは、記載されている言語のどれがあなたに最も親しんでいるかによって異なります。あなたがコマンドラインインタプリタからすぐにそれを使って遊ぶことができるので、私はPythonを使うことをお勧めします。

XML解析用の標準libraryがあります:

from xml.dom.minidom import parse, parseString 

dom1 = parse('c:\\temp\\mydata.xml') # parse an XML file by name 

次に、あなたはこのように、いずれかの名前で、要素を反復処理:すべての要素の

for node in dom1.getElementsByTagName('category1'): 
    ... 

またはストレートフォワード:

for node in dom1.childNodes: 
    ... 

以下は、オブジェクトtの検査方法のコマンドラインインタプリタの写しですREE(インタープリタプロンプトの>>>スタンド):私は本当にこのことを確信していない

$ python 
Python 2.6.5 (r265:79063, Apr 16 2010, 13:57:41) 
[GCC 4.4.3] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> dom = parseString ('<root>contents</root>') 
>>> dom.childNodes 
[<DOM Element: root at 0x7f0d4519f680>] 
>>> dom.childNodes[0] 
<DOM Element: root at 0x7f0d4519f680> 
>>> dom.childNodes[0].childNodes 
[<DOM Text node "u'contents'">] 
>>> dom.childNodes[0].childNodes[0] 
<DOM Text node "u'contents'"> 
>>> dom.childNodes[0].childNodes[0].nodeValue 
u'contents' 
>>> 
関連する問題