繁体   English   中英

从文本或 xml 文件自动生成代码然后编译?

[英]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,解析文件,然后将生成的代码注入正确的位置。

有关 CSharpCodeProvider 的信息

请注意,您需要在 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM