2012-04-22 58 views
1

我们在C#上使用IronPython,并在控制台和应用程序上获得不同的结果。IronPython,C#和XML - 打破缩进?

此代码运行正常的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)"/> 

其他com mands返回预期的结果,我的问题是与缩进的命令(条件,循环)。因为我无法访问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

“包含Python代码的字符串通过XML传递”为什么会发生这种情况? – 2012-04-22 11:04:20

+0

XML是我们设计人员应用程序的接口。由于他们不是程序员,他们只是创建和修改XML文件,使他们更容易理解。在这种情况下,我们需要实现一个Python代码,并且这是传递需要运行的代码的唯一方法。 – GuyB7 2012-04-22 11:28:03

+0

如果他们不是程序员,那么他们如何将Python嵌入到您的XML中? – 2012-04-22 11:39:00

回答

1

无意义的空白不保留

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

一个属性的值被传递给应用程序或检查其有效性之前,如下所述XML处理器必须正常化它: (。 ..) 一个空白字符(#X20,#xD,#xA,#X9)由附加#X20到归一化的值来处理,所不同的是只有一个单一#X20是所附一个 “##的xD XA” 序列,其是外部解析实体的一部分或内部解析实体的文字实体值 (...) 如果声明值不是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

+0

谢谢,这正是我需要的! – GuyB7 2012-04-22 13:00:21

0

看起来XML代码没有换行符。
如果是这样的话,那么运行Python代码的希望就很小。

我不知道如何使XML行为有所不同。也许有些东西可以嵌入到文本中,并转换成换行符(也许\n<br>)。

if语句不能换行不工作,甚至在单行格式。这是因为单行不能有两次。
对于这个程序,你可以用and更换if声明:

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

这样你的代码可以是一个班轮。
但是,如果你试图进一步采取这种方式,你会发现很难这样编程。在XML

+0

是的,看起来XML加入了多个换行符和空格(尽管我不确定,我没有C#应用程序的调试器)。 对于我的具体情况,您的建议非常合适 - 谢谢! 我想我们应该添加一个应该换成换行符的特殊字符。 – GuyB7 2012-04-22 11:20:57