1

我们在 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);"/>

但是我又遇到了同样的错误,因为每个条件后面都应该有一个空行。

有任何想法吗?

4

2 回答 2

1

不保留 xml 中的非重要空格

http://www.w3.org/TR/1998/REC-xml-19980210#AVNormalize

在将属性的值传递给应用程序或检查其有效性之前,XML 处理器必须按如下方式对其进行规范化:(...) 空白字符(#x20、#xD、#xA、#x9)通过附加来处理#x20 到规范化的值,除了对于作为外部解析实体的一部分的“#xD#xA”序列或内部解析实体的文字实体值仅附加一个 #x20 (...) 如果声明的值不是 CDATA,则 XML 处理器必须通过丢弃任何前导和尾随空格 (#x20) 字符以及将空格 (#x20) 字符序列替换为单个空格 (#x20) 字符来进一步处理规范化的属性值.

如果要在 xml 标记中传输带有大量空白的文本,则需要将其包含在cdata 部分中:

<<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 绝对是更好的解决方案


你绝对不应该做的是使用Whython – Python For People Who Hate Whitespace

于 2012-04-22T12:04:40.477 回答
0

似乎从 XML 中出来的代码没有换行符。
如果是这样,您运行 Python 代码的希望渺茫。

我不知道如何使 XML 表现不同。也许您可以在文本中嵌入一些内容,这些内容会转换为换行符(可能是\n<br>)。

if语句不能在没有换行符的情况下工作,即使是单行格式。这是因为单行不能有:两次。
对于此程序,您可以将if语句替换为and

a==1 and str.append('One')

这样,您的代码可以是单行的。
但是,如果您尝试更进一步,您会发现以这种方式进行编程非常困难。

于 2012-04-22T10:42:51.963 回答