我想知道如何从特定格式的文本文件生成代码到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#编写代码生成程序。 我怎么能这样做呢?
答案 0 :(得分: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)
>>>
答案 1 :(得分:0)
您需要编写解析器来解析文本文件。一旦解析器生成类似于VB.net或C#代码的字符串,您就可以使用Emit
编译为临时程序集
答案 2 :(得分:0)
使用CSharpCodeProvider,设置一个字符串框架,这是您的其余部分,解析您的文件,然后将生成的代码注入正确的位置。
Info about the CSharpCodeProvider
请注意,您需要构建内存并将构建可执行文件设置为false。 Here是如何执行此操作的示例,它还显示了如何将编译器的程序集设置为当前正在执行的文件的程序集。
我知道这有点模糊,但是你如何设置实际的CSharpCodeProvider取决于你想要做什么。还要注意,如果你得到FileNotFound异常,你就会遇到编译错误,那么top link就如何以可读的方式抛出它们提供了一个很好的解决方案。
答案 3 :(得分: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:
...
下面是如何检查对象树的命令行解释器脚本(>>>
代表解释器提示符):
$ 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'
>>>