1

次の SOAP 応答を検討してください。

(ArrayOfNotificationData){NotificationData[] = (NotificationData){Id = 1 Title = "notification 1" Message = "bla bla." Published = 2000-01-01 00:00:00}, (NotificationData){Id = 2 Title = "notification 2" Message = "bla bla." Published = 2000-01-01 00:00:00},}

この応答を次のようなものに変換するにはどうすればよいですか。

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<soap:Body>
    <GetNotificationsResponse xmlns="http://localhost/WS.asmx">
        <GetNotificationsResult>
            <NotificationData>
                <Id>1</Id>
                <Title>notification 1</Title>
                <Message>bla bla.</Message>
                <Published>2000-01-01T00:00:00</Published>
            </NotificationData>
            <NotificationData>
                <Id>2</Id>
                <Title>notification 1</Title>
                <Message>bla bla.</Message>
                <Published>2001-01-01T00:00:00</Published>
            </NotificationData>
        </GetNotificationsResult>
    </GetNotificationsResponse>
</soap:Body>

suds を使用して Web サービスを呼び出しています。

4

1 に答える 1

1

ループ内の正規表現は非常に強力な場合があることをご存知ですか。

import re

s = '''(ArrayOfNotificationData){NotificationData[] = (NotificationData){Id = 1 Title = "notification 1" Message = "bla bla." Published = 2000-01-01 00:00:00}, (NotificationData){Id = 2 Title = "notification 2" Message = "bla bla." Published = 2000-01-01 00:00:00},}'''

def f(d):
    for k, v in d.items():
        if v is None:
            d[k] = ''
    return d

def g(reg, rep):
    c1 = s
    c2 = ''
    while c1 != c2:
        c2 = c1
        c1 = re.sub(reg, lambda m: rep.format(**f(m.groupdict())), c1)
    print c1

g('(?P<m>\w+)\s+=\s+(?:(?P<v>\\d+-\\d+-\\d+ \\d+:\\d+:\\d+|\w+)|"(?P<v3>[^"]*)")|(?:(?:\\w|\\[|\\])+\\s*=\\s*)?\\((?P<m2>\w+)\\){(?P<v2>[^}{]*)}\s*,?', '<{m}{m2}>{v}{v2}{v3}</{m}{m2}>')

そして結果は次のとおりです:(フォーマットなしで)

<ArrayOfNotificationData>

    <NotificationData>

        <Id>1</Id> 
        <Title>notification 1</Title> 
        <Message>bla bla.</Message> 
        <Published>2000-01-01 00:00:00</Published>

    </NotificationData> 
    <NotificationData>

        <Id>2</Id> 
        <Title>notification 2</Title> 
        <Message>bla bla.</Message> 
        <Published>2000-01-01 00:00:00</Published>

    </NotificationData>

</ArrayOfNotificationData>

未フォーマット:

<ArrayOfNotificationData><NotificationData><Id>1</Id> <Title>notification 1</Title> <Message>bla bla.</Message> <Published>2000-01-01 00:00:00</Published></NotificationData> <NotificationData><Id>2</Id> <Title>notification 2</Title> <Message>bla bla.</Message> <Published>2000-01-01 00:00:00</Published></NotificationData></ArrayOfNotificationData>

私はこれがとても好きです。そうでなければ、私はこのソリューションを作成しなかったでしょう。文脈自由文法に正規表現置換を使用したい場合は、注意が必要です。

ところで:コードの間に}またはがある場合、これは機能しません: これについても助けが必要な場合は、コメントを書いてください :){""Title = "notification} 1"

于 2013-04-08T17:20:10.657 に答える