2016-02-05 3 views
0

Я бы просто хотел получить «первый подэлемент» из документа XML. Пока все работает, но он всегда сохраняет последний элемент subItem. В основном программа читает прямо через документ XML и останавливается, как только находит, что я хочу. Возможно, я не понимаю, как остановить разбор после того, как он нашел первый элемент. Должен ли я сказать программе остановиться после того, как она найдет первый элемент или добавит их в массив, а затем выберет определенную часть? Любая помощь будет большой.Как получить определенный элемент при обработке XML?

XML Doc

<file>main file 
    <item> 
      <subItem>first subitem</subItem> 
    </item> 
</file> 
<file>main file 
    <item> 
      <subItem>second subitem</subItem> 
    </item> 
</file> 
<file>main file 
    <item> 
      <subItem>third subitem</subItem> 
    </item> 
</file> 

Swift файл

class parseThis { 

var strXMLData:String = "" 
var currentElement:String = "" 
var passData:Bool=false 
var passName:Bool=false 
var itemNeeded = "" 

// set up for parsing 

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

currentElement=elementName; 
    if(elementName=="file" || elementName=="item" || 
    elementName=="subItem") 

    { 
     if(elementName=="subItem"){ 


     passName=false; 
     } 
     passData=true; 
    } 
} 

func parser(parser: NSXMLParser, didEndElement elementName: String, 
namespaceURI: String?, qualifiedName qName: String?) { 
    currentElement=""; 
currentElement=elementName; 
    if(elementName=="file" || elementName=="item" || 
    elementName=="subItem"){ 

    if(elementName=="subItem"){ 
     passName=false; 
     } 
     passData=false; 
    } 

} 
    func parser(parser: NSXMLParser, foundCharacters string: String) { 
    if(passName){ 
     strXMLData=strXMLData+"\n\n"+string 
    } 

    if(passData) 
    { 

    itemNeeded = string 



} 

ответ

0

супер упрощенный способ смотреть на это является то, что вам нужно только didFindCharacters и didEndElement. Каждый раз, когда вы попадаете в didFindCharacters, вы сохраняете их в переменной. Затем каждый раз, когда вы заканчиваете элемент, вы проверяете, является ли это правильным именем элемента и является ли это первым из этого типа имени элемента. Что-то вроде этого:

var resultString : String? 
var finalResultObject : String? 

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

public func parser(parser: NSXMLParser, foundCDATA CDATABlock: NSData) 
{ 
    resultString = String(data: CDATABlock, encoding: NSUTF8StringEncoding) 
} 

public func parser(parser: NSXMLParser, foundCharacters string: String) 
{ 
    if(resultString == nil) 
    { 
     resultString = "" 
    } 
    resultString! += string 
} 

public func parser(parser: NSXMLParser, didEndElement elementName: String, namespaceURI: String?, qualifiedName qName: String?) 
{ 
    if(elementName == "subItem" && finalResultObject == nil) 
    { 
     //This is your first element of this type, save whatever you want. 
     finalResultObject = resultString 
    } 
    resultString = nil 
} 

public func parser(parser: NSXMLParser, parseErrorOccurred parseError: NSError) 
{ 
    //Log something in debug if you would like to. 
} 
Смежные вопросы