2011-07-13 15 views
0

アプリケーションとサーバーとの通信に使用するプロトコルを実装しようとしています。問題は、サーバーがXMLを使用しているため、xmlを含むサーバーに文字列を送信しようとしましたが、エラーのみが出ます。XMLとDelphiの問題

私はこれを送信します

mymsg: String = '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>'+ 
'<m:outgoingEngineMessage xmlns:c="http://www.bvb.ro/xml/ns/arena/gw/constraints"'+ 
'xmlns:m="http://www.bvb.ro/xml/ns/arena/gw/msg"'+ 
'xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;&gt;'+ 
'&lt;content xsi:type=&quot;HeartBeatcmd&quot;&gt;'+ 
'&lt;/content&gt;'+ 
'&lt;csq&gt;100212&lt;/csq&gt;'+ 
'&lt;/m:outgoingEngineMessage&gt;'; 

私が言ってエラーが表示されます。

要素タイプ "M:outgoingEngineMessageは" どちらか 属性仕様、続かなければなりません "& GT;"または "/ & gt;"

私は、この送信した場合:

mymsg : String = '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>'+ 
    '&lt;m:outgoingEngineMessage xmlns:c=&quot;http://www.bvb.ro/xml/ns/arena/gw/constraints"'+ 
    'xmlns:m="http://www.bvb.ro/xml/ns/arena/gw/msg"'+ 
    'xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;&gt;'+ 
    '&lt;content xsi:type=&quot;HeartBeatcmd&quot;&gt;'+ 
    '&lt;/content&gt;'+ 
    '&lt;csq&gt;100212&lt;/csq&gt;'+ 
    '&lt;/m:outgoingEngineMessage&gt;' 

を私が手:Elementはプロローグで許可されていません...

いくつかのいずれかは、私が間違ってやっているものを私を啓発することはできますか?以前はxmlファイルで作業していませんでした。 xmlをutf8に正しく変換する関数はありますか?説明してください。

+0

Webで「xmlns:xsi」というドキュメントを検索すると、xmlns:xsi = "..."のような引用符を使用していて、xmlns:xsi = "..."ではなく、閉じた ''タグのような他の明白な違いrはルート要素です。あなたの例では、終了する ''はありません。 – mjn

+2

おっと! XMLを "手で生成"しないでください - これを行うためにライブラリを使用してください。それは長期的にあなたに多くのトラブルを救うでしょう。 – Misha

答えて

4

を改行が属性間にある各行の終わり。あなたは一緒にすべてを妨害効果にあります。

<m:outgoingEngineMessage xmlns:c="http://www.bvb.ro/xml/ns/arena/gw/constraints"'+ 
'xmlns:m="http://www.bvb.ro/xml/ns/arena/gw/msg"'+ 
'xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">' 

が生成されます:

<m:outgoingEngineMessage xmlns:c="http://www.bvb.ro/xml/ns/arena/gw/constraints"xmlns:m="http://www.bvb.ro/xml/ns/arena/gw/msg"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 

をこの問題を解決するには、あなたが(@ The_Foxのコードに基づいて)、次のような何かをする必要があります。

mymsg: String = '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>'+ 
'<m:outgoingEngineMessage xmlns:c="http://www.bvb.ro/xml/ns/arena/gw/constraints" '+ 
//               see the space here --^ 
'xmlns:m="http://www.bvb.ro/xml/ns/arena/gw/msg" '+ 
//         and here --^ 
'xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">'+ 
'<content xsi:type="HeartBeatcmd">'+ 
'</content>'+ 
'<csq>100212</csq>'+ 
'</m:outgoingEngineMessage>'; 
+0

感謝!女性コーダーが存在することを知らなかった – opc0de

+2

はい、私たちの周りにはいくつかあります:) – Nat

6

「整形式」XMLを生成する最も安全な方法は、NativeXml,OmniXML(オープンソースの両方)やMSXMLライブラリ(Delphiはラッパーを提供)などのXMLライブラリを使用しています。

1

あなたは<を避けて避けてください。それらがXMLの一部でないときにのみ、エスケープします。このような

<content foo="bar"> 
2 + 2 &gt; 3 
</content> 

そしてません:

このよう

&lt;content foo=&quot;bar%quot;&gt; 
2 + 2 &gt; 3 
&lt;/content&gt; 

だからあなたのXMLは次のようになります。あなたはまたにスペースを配置する必要があり

mymsg: String = '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>'+ 
'<m:outgoingEngineMessage xmlns:c="http://www.bvb.ro/xml/ns/arena/gw/constraints" '+ 
'xmlns:m="http://www.bvb.ro/xml/ns/arena/gw/msg" '+ 
'xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">'+ 
'<content xsi:type="HeartBeatcmd">'+ 
'</content>'+ 
'<csq>100212</csq>'+ 
'</m:outgoingEngineMessage>'; 
+0

私はまだこのエラーメッセージが表示されます。エレメントタイプ "m:outgoingEngineMessage"の後ろに、属性指定 ">"または "/ >"のいずれかが続かなければなりません。 – opc0de

+0

XMLとXHTML文書は属性間に白いwpacesを持つ必要がありますが、コードは '.../constraints" xmlns:m = "http ...を作成します'、より良い正しいXMLコードを表示する(Delphiの定数宣言の代わりに) – mjn

+0

各行の文字列を閉じる前に空白を入れてください。例えば、... gw/constants" '+' – Nat