[英]Automatically generating code from a text or xml file and then compiling?
我想知道如何将特定格式的文本文件中的代码生成为 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})
这个想法是在用户修改txt文件并使用代码生成程序后编译主要代码。 我更喜欢在 C、python 或 C# 中编写代码生成程序。 我怎么能 go 关于这个?
我不太相信这是一个 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)
>>>
您需要编写解析器来解析您的文本文件。 一旦解析器生成类似于 VB.net 或 C# 代码的字符串,您可以使用Emit
编译为临时程序集
使用 CSharpCodeProvider,设置一个字符串框架,即 class 的 rest,解析文件,然后将生成的代码注入正确的位置。
请注意,您需要在 memory 中构建并将构建可执行文件设置为 false。 这是一个有关如何执行此操作的示例,它还显示了如何将编译器的程序集设置为当前执行文件的程序集。
我知道这有点含糊,但是您如何设置实际的 CSharpCodeProvider 取决于您要做什么。 另请注意,如果您遇到 FileNotFound 异常,则会出现编译错误,顶部链接提供了一个很好的解决方案,说明如何以可读的方式抛出它们。
这取决于您最熟悉哪种语言。 我推荐 go 和 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:
...
下面是如何检查 object 树的命令行解释器脚本( >>>
代表解释器提示):
$ 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'
>>>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.