我们在C#上使用IronPython,我在控制台和应用程序上得到了不同的结果。
此代码在IronPython控制台上正常运行:
str=[]
a = 1
b = 0
c = 1
if a==1:
str.append('One')
if b==1:
str.append('Two')
if c==1:
str.append('Three')
out=','.join(str)
print out
但是相同的代码在我们的应用程序中返回错误:
unexpected token 'if'
我怀疑问题出在我的换行符中,因为包含Python代码的字符串是通过XML传递的(XML> C#> Python):
<Set key="PythonCode" value="ipy:str=[]
a = 1
b = 0
c = 1
if a==1:
str.append('One')
if b==1:
str.append('Two')
if c==1:
str.append('Three')
out=','.join(str)"/>
其他命令返回预期结果,我的问题是缩进命令(条件,循环)。
由于我无法访问C#代码,因此我寻找一种编写单行的方法,或者不依赖于缩进或换行的任何其他方式。 我试过这个:
<Set key="PythonCode" value="ipy:str=[];
a = 1;
b = 0;
c = 1;
if a==1: str.append('One');
if b==1: str.append('Two');
if c==1: str.append('Three');
out=','.join(str);"/>
但我又得到了同样的错误,因为每个条件后应该有一个空行。
有什么想法吗?
答案 0 :(得分:1)
xml中无显着的空格不会被保留
http://www.w3.org/TR/1998/REC-xml-19980210#AVNormalize
在将属性的值传递给应用程序或检查其有效性之前,XML处理器必须按如下方式对其进行规范化: (......) 通过将#x20附加到标准化值来处理空白字符(#x20,#xD,#xA,#x9),除了为“#xD#xA”序列仅附加单个#x20之外,该序列是外部解析实体或内部解析实体的文字实体值 (......) 如果声明的值不是CDATA,则XML处理器必须通过丢弃任何前导和尾随空格(#x20)字符,并通过用单个空格替换空格(#x20)字符序列来进一步处理规范化的属性值(#x20 )角色。
如果要在xml标记内传输包含大量空格的文本,则需要将其括在cdata section内:
<<Set key="PythonCode"><![CDATA[
YOUR CODE HERE
]]></Set>
据我所知,您不能在属性字符串中使用cdata部分,因此您必须更改xml格式的那部分以将代码括在代码中。
另一种解决方法是告诉xml导出器以及xml导入器保留不重要的空白。
对于c#如何做到这一点取决于你用来解析xml的方法(XDocument,XmlDocument,...),参见例如
http://msdn.microsoft.com/en-us/library/system.xml.xmldocument.preservewhitespace(v=vs.71).aspx
http://msdn.microsoft.com/en-us/library/bb387014.aspx
http://msdn.microsoft.com/en-us/library/bb387103.aspx
但使用cdata绝对是更好的解决方案
答案 1 :(得分:0)
似乎XML中的代码没有换行符
如果是这样的话,你几乎没有希望运行Python代码。
我不知道如何使XML的行为方式不同。也许你可以在文本中嵌入一些可以转换为换行符的内容(可能是\n
或<br>
)。
if
语句在没有换行符的情况下无法工作,即使是单行格式也是如此。这是因为单行不能两次:
对于此计划,您可以将if
语句替换为and
:
a==1 and str.append('One')
这样你的代码可以是单行代码 但如果你试图进一步采取这种做法,你会发现很难以这种方式进行编程。