2012-04-22 65 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