2

私は、SOAPリクエストを解析する必要があるホームプロジェクトでいくつかの問題を経験しています。SOAPはgSOAPで生成され、デンマーク語の文字「æøå」などの特殊文字を含む文字列パラメーターを含みます。

gSOAPは、デフォルトでUTF-8エンコーディングを使用してSOAPリクエストを作成しますが、特殊文字をraw形式(つまり、特殊文字「æ」のバイトC3A6)で送信する代わりに、文字ハッシュ参照(つまり、&#)と呼ばれるものを送信します。 195;¦)。

とにかく受信ペイロードがUTF-8エンコード(Content-Type:text / xml; charset = utf-8)としてマークされていることがわかるので、gSOAPがこのようにする理由を完全には理解していませんが、これは別です質問(私は思う)。

とにかく、gSOAPはおそらくトランスポートルールに従っていると思いますか、それとも何ですか?

xml.dom.minidom.parseString()を使用してPythonでgSOAPからの要求を解析すると、要素値がユニコードオブジェクトとして取得されますが、文字ハッシュ参照はUTF-8文字コードとしてデコードされません。文字ハッシュ参照をエスケープ解除しますが、後で文字列をデコードしません。最後に、UTF-8エンコーディングのUnicode文字列オブジェクトがあります。

したがって、文字列「æble」がXMLに含まれている場合、リクエストでは次のようになります。

"æble"

XMLを解析した後、DOMテキストノードのデータメンバーのUnicode文字列は次のようになります。

u'\xc3\xa6ble'

私はそれがこのように見えることを期待します:

u'\xe6ble'

私は何が間違っているのですか?解析する前にSOAPXMLのエスケープを解除する必要がありますか、それとも他の場所で解決策、おそらくgSOAPを探す必要がありますか?

前もって感謝します。

よろしくJakobSimon-Gaarde

4

5 に答える 5

1

æbleは実際にæble

u'\xe6ble'解析後に予想される Unicode 文字列を取得するには、リクエスト内の文字列をæble.

于 2011-01-12T00:11:31.650 に答える
0

そのようなものをエスケープ解除する方法は次のとおりです:http://effbot.org/zone/re-sub.htm#unescape-html

ただし、主な問題は、あなたやこの「gSOAP」(URLをお願いします)が行っていることです...

例の文字は、LATIN SMALL LIGATURE AE(U + 00E6)です。あなたが言うように、UTF-8でエンコードされた、これは\xc3\xa6です。0xc3 ==195および0xa6==166。0xe6==230。キャラクターをエスケープする'æ'と、ではなく、が生成されます'æ'

ただし、最初にUTF-8にエンコードしてから、エスケープを実行しているようです。

あなたがする必要があるのは、あなたが診断プリントと一緒に使用しているコードを詳細に示すことです(repr()関数を使用して、プロセスに関与する各オブジェクトのタイプstrと明確に表現されたコンテンツを確認できます) unicode。また、使用しているgSOAPAPIのドキュメントも提供してください。

受信側で、受信した生のXMLのrepr()を表示してください。

別の回答に対するこのコメントに応じて編集してください: "" "問題は、minidom.parseString()がUnicodeにデコードする前に文字ハッシュ表現をエスケープ解除していないように見えることです。" ""

それ(および他のXMLパーサー)は、デコードする前に、数値文字参照または事前定義された文字エンティティをエスケープ解除しません。

(1)逃げ"&#60;"られ"<"ないで爆破する

(2)あなたは何に逃げ"&#256"ますか?"\xc4\x80"

(3)エンコーディングがUTF-16xxの場合、どのようにしてエスケープを解除できますか?

于 2011-01-12T00:15:20.533 に答える
0

gSOAP が有効なエンコードされた SOAP XML を生成していないことを誰かが教えてくれない限り: ( http://pastebin.com/raw.php?i=9NS7vCMBまたは以下のコードブロックを参照) 解析する前に文字ハッシュ参照をエスケープ解除する以外に解決策はありません。 XML。

もちろん、John Machin が指摘したように、"<" や ">" などの XML 制御文字をエスケープ解除することはできません。

<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:ns1="urn:ShopService"><SOAP-ENV:Body SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"><ns1:createCompany><company-code>DK-123</company-code><name>&#195;&#166;ble</name></ns1:createCompany></SOAP-ENV:Body></SOAP-ENV:Envelope>

/ヤコブ

于 2011-01-12T08:29:40.653 に答える
0

ご了承ください

In [5]: 'æ'.encode('utf-8')
Out[5]: '\xc3\xa6'

つまり、 は unicode オブジェクトu'\xc3\xa6'であり、実際には string オブジェクトが必要です'\xc3\xa6'raw-unicode-escapeこの変換は、次のコーデックで実行できます。

In [1]: text=u'\xc3\xa6'
In [2]: text.encode('raw-unicode-escape')
Out[2]: '\xc3\xa6ble'

In [3]: text.encode('raw-unicode-escape').decode('utf-8')
Out[3]: u'\xe6'

In [4]: print(text.encode('raw-unicode-escape').decode('utf-8'))
æ
于 2011-01-12T00:25:24.853 に答える
0

私の問題についての詳細。私が作成しているプロジェクトは wsgi を使用しています。SOAP リクエストは、 を使用して抽出されenviron['wsgi.input'].read()ます。常に生の文字列を返すようです。文字ハッシュをエスケープ解除する関数を作成しました。

def unescape_hash_char(req):
  pat = re.compile('&#(\d+);',re.M)
  parts = pat.split(req)
  a=0
  ret = ''
  for p in parts:
    if a%2:
      n = chr(int(p))
    else:
      n = p
    ret += n
    a+=1
  return ret

これを行った後、XML を解析すると、期待される結果が得られます。

それでも、あなたの考えを知りたいのですが、それが良い解決策であるかどうか. また、標準のpythonモジュールで仕事をする関数が見つからなかったので関数を書きましたが、そのような関数は存在しますか?

敬具ヤコブ・シモン・ガルデ

于 2011-01-11T23:56:01.147 に答える