我有这个XML:
<TRANSACTION>
<TRANSACTIONTYPE>PushJournalEventSCW</TRANSACTIONTYPE>
<JEVENT>
<JOURNAL>
<EVENTID>ffdgdfg</EVENTID>
<EVENTNAME>dfgd</EVENTNAME>
<EVENTDATETIME>12/4/6</EVENTDATETIME>
<JOURNAL>
</JOURNAL>
<EVENTID>test</EVENTID>
<EVENTNAME>test</EVENTNAME>
<EVENTDATETIME>tset</EVENTDATETIME>
</JOURNAL>
<!--....continued events-->
</JEVENT>
</TRANSACTION>
在delphi函数中,我想通过XML解析并将其以这种JSON格式:
{
"EVENTID": "ffdgdfg",
"EVENTNAME": "dfgd",
"EVENTDATETIME": "12/4/6"
}
{
"EVENTID": "test",
"EVENTNAME": "test",
"EVENTDATETIME": "test"
}
到目前为止,我拥有的功能只是返回:
{
"EVENTID": "ffdgdfg",
"EVENTNAME": "dfgd",
"EVENTDATETIME": "12/4/6"
}
并且不循环遍历所有节点。
这是我的代码:
function TJournalEventSCW.GenerateResponse( var APIMessage : TMQAPIManager; Parent : TmdWrkWrapper ) : Integer;
var
//trial : TJournalList;
tmp ,EventId,JournalItemXML,JSONtest,EventDT,EventName: String;
JournalList: TJournalList;
JournalObj: TJournal;
JournalOpenXML : TOpenXML;
Counter, TempLocalJID, TempEventID: integer;
RuleNode: TOPENXMLDomElement;
Node: TOpenXMLNode;
//EventId :tstringlist;
begin
result:=0;
JournalOpenXML := TOpenXML.CreateFromString(nil, APIMessage.ToString);
ProcessLog( ltInfo, 'JournalSCWrk.GenerateResponse', 'Echo: ' + JournalOpenXML.GetXPathNodeAsXMLString('/TRANSACTION',true));
tmp := APIMessage.ToString();
Counter := 1;
JournalItemXML := JournalOpenXML.GetXPathNodeAsXMLString('/TRANSACTION[' + IntToStr(Counter) + ']', true);
while (JournalItemXML <> '') do begin
EventID := GetXMLTagStr(JournalItemXML, 'EVENTID');
EventDT := GetXMLTagStr(JournalItemXML, 'EVENTNAME');
EventName := GetXMLTagStr(JournalItemXML, 'EVENTDATETIME');
JSONtest := JSONtest + '{"EVENTID":"' + EventID + '",'+'"EVENTNAME":"' + EventName + '",'+'"EVENTDATETIME":"'+ EventDT + '"}';
Inc(Counter);
JournalItemXML := JournalOpenXML.GetXPathNodeAsXMLString('/TRANSACTION[' + IntToStr(Counter) + ']', true);
end;
ProcessLog( ltInfo, 'JournalSCWrk.GenerateResponse', 'EventID: ' + JSONtest);
APIMessage.AddResponse(JSONtest);
end;
您显示的XML中只有1个TRANSACTION
元素。您的'/TRANSACTION[1]'
的XPath返回第一个元素,从中提取第一个JOURNAL
值集,然后当'/TRANSACTION[2]'
找不到另一个TRANSACTION
元素时,循环中断。这就是为什么只输出第一个JOURNAL
元素的值的原因。
尝试让循环使用'/TRANSACTION/JEVENT/JOURNAL[N]'
而不是'/TRANSACTION[N]'
的XPath。
或者,仅对'/TRANSACTION/JEVENT'
执行1个XPath查询,然后对仅'JOURNAL[N]'
的结果执行XPath循环。