2015-10-27 6 views
0

У меня есть следующие данные XML из веб-службы:NSXMLParser расщеплении XML TAG Значение

<ROWS> 
<ROW> 
<GroupBy>1</GroupBy> 
<QUERY> 
INSERT INTO TASKS_GVT([PK],[TaskYear],[TaskTypeId],[TaskElementType],[TaskPriority],[ElementId],[taskstatus],[TaskSubStatus],[AllocatedteamId],[PreRequisiteTask], [xloc],[yloc],[X],[Y],[Address],[TaskZone],[taskread],[clientid],[distance],[lastdistcalcdt],[ReplicateMe],[AllocationRequestTime]) VALUES ('3179543',2014,'19','1','2','107-08-106_421','3','6','380','0','0.0000000','0.0000000','44.4144000','24.5186000','الدوادمي ','421-0-0','R','0','0',GETDATE(),0,GETDATE()) 
</QUERY> 
</ROW> 
<ROW> 
<GroupBy>2</GroupBy> 
<QUERY> 
INSERT INTO RPTProblemTypes_GVT ([TaskYear] ,[TaskCode] ,[pbTypeId] ,[ReportDate] ,[INSTANCENAME] ,[PK] ,[ParentId]) VALUES ('2015','3179543','754','Sep 11 2015 11:11AM','1-1086','380-1','1086') 
</QUERY> 
</ROW> 
<ROW> 
</ROWS> 

Я читаю ответ веб-службы с помощью NSXMParser так:

let parser = NSXMLParser (data: data!) //data is fetched using alamofire 

методы делегата:

public func parser(parser: NSXMLParser, didStartElement elementName: String, namespaceURI: String?, qualifiedName qName: String?, attributes attributeDict: [String : String]) 
{ 
    tagElement=elementName 
} 

public func parser(parser: NSXMLParser, foundCharacters string: String) 
{ 

    if (tagElement.uppercaseString == "QUERY") 
     { 
      dataReturned+=string; 
      print ("here dataReturned: \(string)") 
     } 
} 
public func parser(parser: NSXMLParser, didEndElement elementName: String, namespaceURI: String?, qualifiedName qName: String?) 
{ 
} 

Мой Выход:

here dataReturned: INSERT INTO TASKS_GVT([PK],[TaskYear],[TaskTypeId],[TaskElementType],[TaskPriority],[ElementId],[taskstatus],[TaskSubStatus],[AllocatedteamId],[PreRequisiteTask], 
here dataReturned: 
[xloc],[yloc],[X],[Y],[Address],[TaskZone],[taskread],[clientid],[distance],[lastdistcalcdt],[ReplicateMe],[AllocationRequestTime]) VALUES ('3179543',2014,'19','1','2','107-08-106_421','3','6','380','0','0.0000000','0.0000000','44.4144000','24.5186000',' 
here dataReturned: الدوادمي ','421-0-0','R','0','0',GETDATE(),0,GETDATE()) 
here dataReturned: 
here dataReturned: INSERT INTO RPTProblemTypes_GVT ([TaskYear] ,[TaskCode] ,[pbTypeId] ,[ReportDate] ,[INSTANCENAME] ,[PK] ,[ParentId]) VALUES ('2015','3179543','754','Sep 11 2015 11:11AM','1-1086','380-1','1086') 

Как вы можете видеть, меня интересует только извлечение тега QUERY, но результат неправильный! Значение тега разделяется (т. Е. Метод foundCharacters вызывается более одного раза на одном и том же теге), пожалуйста, кто-нибудь поможет мне в этой проблеме.

что я заметил, что этот случай происходит ТОЛЬКО, когда в теге есть арабские буквы. !!!

спасибо

+0

если требуется еще какой-либо код, пожалуйста, сообщите мне –

+0

Любой может здесь помочь? –

ответ

0

для тех, кто испытывает трудности с NSXMParser, используйте SWXMLHash, которая является простым и лучшим способом, очевидно

https://github.com/drmohundro/SWXMLHash

я в конечном итоге делаю что-то вроде этого:

let xml = SWXMLHash.lazy(ReturnedData) 

let Queries = (xml["ROWS"]["ROW"].all.map { elem in elem["QUERY"].element!.text;}) 

for Query in Queries 
{ 
    print (Query) 
} 
Смежные вопросы