IronPython,C#和XML - 打破缩进?

时间:2012-04-22 10:20:38

标签: python xml ironpython indentation

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

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

有什么想法吗?

2 个答案:

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


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

答案 1 :(得分:0)

似乎XML中的代码没有换行符 如果是这样的话,你几乎没有希望运行Python代码。

我不知道如何使XML的行为方式不同。也许你可以在文本中嵌入一些可以转换为换行符的内容(可能是\n<br>)。

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

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

这样你的代码可以是单行代码 但如果你试图进一步采取这种做法,你会发现很难以这种方式进行编程。