0

ストンプメッセージを取得するコードがありますが、これは機能します。次に、stompメッセージからxmlを取得して、何かを実行したいと思います。これは、コードがあり、機能します。

課題は、メッセージから断片を取り除き、xmlのみを取得することです。

ストンプメッセージのサンプルを次に示します(はい、データは同じですが、ここでは関係ありません)。

MESSAGE
_HQ_ORIG_ADDRESS:jms.queue.edu
timestamp:1339716293764
redelivered:false
_HQ_ORIG_MESSAGE_ID:xxxxxxxx
expires:0
subscription:subscription/jms.queue.edu
priority:4
message-id:xxxxxxxxxx
destination:jms.queue.edu

<?xml version="1.0" encoding="UTF-8" standalone="yes"?><create><sourceMessageId>4454</sourceMessageId><messageId>3038</messageId><course> <batchUid>ASIA.355.921.2012S1.6733</batchUid><title>ASIA355-921-Chinese Cinema</title><startDate>2012-06-18-07:00</startDate><endDate>2012-09- 21-07:00</endDate><mappedNodeBatchUid>9c0bc373-23a0-4e60-b201- efbbc9bb022e</mappedNodeBatchUid><available>false</available></course></create>
MESSAGE
_HQ_ORIG_ADDRESS:jms.queue.edu
timestamp:1339716293764
redelivered:false
_HQ_ORIG_MESSAGE_ID:xxxxxxxx
expires:0
subscription:subscription/jms.queue.edu
priority:4
message-id:xxxxxxxxxx
destination:jms.queue.edu

<?xml version="1.0" encoding="UTF-8" standalone="yes"?><create><sourceMessageId>4454</sourceMessageId><messageId>3038</messageId><course> <batchUid>ASIA.355.921.2012S1.6733</batchUid><title>ASIA355-921-Chinese Cinema</title><startDate>2012-06-18-07:00</startDate><endDate>2012-09- 21-07:00</endDate><mappedNodeBatchUid>9c0bc373-23a0-4e60-b201- efbbc9bb022e</mappedNodeBatchUid><available>false</available></course></create>

私がやりたいのは、「MESSAGE」から始まり、xmlで始まる各行の前の改行までのメッセージ内のすべての行を削除することです。これにより、xmlパーサーを使用して解析するために必要な結果が得られます。

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?><create><sourceMessageId>4454</sourceMessageId><messageId>3038</messageId><course> <batchUid>ASIA.355.921.2012S1.6733</batchUid><title>ASIA355-921-Chinese Cinema</title><startDate>2012-06-18-07:00</startDate><endDate>2012-09- 21-07:00</endDate><mappedNodeBatchUid>9c0bc373-23a0-4e60-b201- efbbc9bb022e</mappedNodeBatchUid><available>false</available></course></create>
    <?xml version="1.0" encoding="UTF-8" standalone="yes"?><create><sourceMessageId>4454</sourceMessageId><messageId>3038</messageId><course> <batchUid>ASIA.355.921.2012S1.6733</batchUid><title>ASIA355-921-Chinese Cinema</title><startDate>2012-06-18-07:00</startDate><endDate>2012-09- 21-07:00</endDate><mappedNodeBatchUid>9c0bc373-23a0-4e60-b201- efbbc9bb022e</mappedNodeBatchUid><available>false</available></course></create>

私は試した:

$xmlstr = preg_replace("/MESSAGE(.*)jms.queue.edu$/ims",'',$msg);
$xmlstr = trim($xmlstr);

ただし、これにより、最初の行の「MESSAGE」の最初の出現からxmlの最後の出現までのすべてが削除されます。つまり、最初の「MESSAGE」と最後の「xml」の間のすべての行が削除されます。

何か案は?私は次のようなさまざまなトリックを使ってみました。正規表現、implode / explode、ファイルへの書き込み/読み取りなど。ただし、上記のpreg_replaceコードは機能していると思います。必要なのは、すべての出現箇所を認識できることだけです。「while」ループまたは「foreach」ループのいずれかが含まれることはわかっていますが、すてきでクリーンなソリューションを楽しみにしています。どんな助けでも大歓迎です。

4

1 に答える 1

1

?の後に使用し*ます。

または、これを試してください。

list(,$body) = explode("\r\n\r\n",$msg); // adjust line ending as needed
list($xmlstr) = explode("\r\n",$body);

これにより、すべてのXMLを含む行が取得されます。

于 2012-06-21T16:34:32.260 に答える