使用Delphi 5解析XML

问题描述 投票:0回答:1

我有这个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 delphi delphi-5
1个回答
0
投票

您显示的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循环。

© www.soinside.com 2019 - 2024. All rights reserved.