从文本或XML文件自动生成代码并编译?

1 投票
4 回答
800 浏览
提问于 2025-04-16 21:38

我想知道如何从一个特定格式的文本文件生成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)
>>> 

撰写回答