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 を正規化された値に、ただし、単一の #x20 のみが、外部の解析済みエンティティの一部である "#xD#xA" シーケンスまたは内部の解析済みエンティティのリテラル エンティティ値に追加される場合を除きます (...)宣言された値が CDATA でない場合、XML プロセッサは、先頭と末尾のスペース (#x20) 文字を破棄し、一連のスペース (#x20) 文字を単一のスペース (#x20) 文字に置き換えることによって、正規化された属性値をさらに処理する必要があります。 .

xml タグ内に重要な空白を含むテキストを送信する場合は、それをcdata セクション内で囲む必要があります。

<<Set key="PythonCode"><![CDATA[ 

YOUR CODE HERE

]]></Set>

私の知る限り、属性文字列内で cdata セクションを使用することはできないため、xml 形式のその部分を変更して、コードをタグで囲む必要があります。


もう 1 つの回避策は、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単一行形式であっても、ステートメントは改行なしでは機能しません。これは、1 つの行に:2 つの行を含めることができないためです。
このプログラムでは、ifステートメントをand次のように置き換えることができます。

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

このようにして、コードをワンライナーにすることができます。
しかし、これをさらに進めようとすると、この方法でプログラムするのは非常に難しいことがわかります。

于 2012-04-22T10:42:51.963 に答える