从文本或XML文件自动生成代码并编译?
我想知道如何从一个特定格式的文本文件生成VB.net或C#的源代码。
举个例子:我希望我的代码生成程序能够读取一个格式如下的文本文件:
<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})
这个想法是,在用户修改了文本文件并使用代码生成程序后,能够编译出主代码。我更倾向于用C、Python或C#来编写这个代码生成程序。我该怎么做呢?
4 个回答
0
你需要写一个解析器来解析你的文本文件。一旦解析器生成的字符串类似于VB.net或C#代码,你就可以使用Emit
来编译成一个临时的程序集。
0
这要看你对哪种语言最熟悉。我建议你选择Python,因为你可以直接在命令行中开始使用它,非常方便。
Python有一个标准的库可以用来解析XML文件:
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:
...
下面是命令行解释器的记录,展示了如何查看对象树(>>>
表示解释器的提示符):
$ 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'
>>>
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)
>>>