2011-04-05 72 views
1

我試圖分析在iPhone上使用NSXMLParser一些XML。獲取XML子元素 - 包括標籤名稱

當我發現我想要的元素,我想擁有的一切是開始元素和結束元素之間

例如,給定:

<A> 
    <K> 
     <C> 
      <D>dddd</D> 
     </C> 
     <E> eeee </E> 
    </K> 
    <F> ffff </f> 
</A> 

我想指定ķ

和接收:

<C> 
     <D> dddd </D> 
    </C> 
    <E> eeee </E> 

然而,目前的NSXMLParser忽略所有的<>和屬性。 我在委託方法中放入了什麼,以確保我在指定的標籤之間獲得所有內容?

這是我現在所擁有的:提前

//---when the start of an element is found--- 
-(void) parser:(NSXMLParser *) parser didStartElement:(NSString *) elementName namespaceURI:(NSString *) namespaceURI qualifiedName:(NSString *) qName attributes:(NSDictionary *) attributeDict { 

    if([elementName isEqualToString:@"ns11:createNewPrincipalResponse"]) 
    { 
     elementFound = YES; 
     NSLog(@"PrincResp FOUND"); 
    } 
} 


-(void)parser:(NSXMLParser *) parser foundCharacters:(NSString *)string 
{ 
    if (elementFound) 
    { 
     [parseResults appendString: string]; 
    } 
} 


//---when the end of element is found--- 
-(void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName 

    if ([elementName isEqualToString:@"ns11:createNewPrincipalResponse"]) 
    { 
     //---displays the country--- 
     NSLog(@"\n******************\nParse Results...\n*************\n\n%@",parseResults); 
     [parseResults setString:@""]; 
     token = [NSString stringWithString:parseResults]; 
     elementFound = FALSE; 
    } 
} 

謝謝!

回答

1

您可能可以使用columnNumber,lineNumber解析器的方法來獲取元素開始的位置(即,將它們存儲爲您在查找的元素的didStartElement中的column1,line1),然後當該元素結束時,在didEndElement中, column2和line2,然後將原始XML中的文本從(line1,column1)剪切爲(line2,column2)。

相當哈克,但它可能會工作。

編輯:提取文本,你可以做這些方針的東西:如果元素開始/時解析器的位置結束

__block int lineNumber = 0; 
__block NSMutableString* result = [NSMutableString stringWithCapacity:100]; 

[str enumerateLinesUsingBlock:^(NSString* line, BOOL* stop) { 

if(lineNumber == line1) { 
    [result appendString:[line substringFromIndex:column1]]; 
} 
if(lineNumber > line1 && lineNumber < line2) [result appendString:line]; 

if(lineNumber == line2) { 
    [result appendString:[line substringToIndex:column2]]; 
} 
lineNumber++; 
if(lineNumber > line2) *stop = YES; 

}]; 

我不知道是在開始或在元素的結尾 - 您可能需要自己跳過它,或者如果位置在元素的末尾,請檢查column1/column2是否不在該行之外(在這種情況下,不添加任何內容)。另外,如果你需要保留換行符,你需要他們自己添加(而不是appendString:STR使用appendFormat:「%@ \ n」,STR)

+0

好的,我成功地獲得了列和行號,任何想法我可以使用哪種方法從某個列和行提取子字符串到另一列和行? – klyngbaek 2011-04-05 17:07:43

+0

在已編輯的答案中看到一個示例 – SVD 2011-04-05 17:40:29

+0

謝謝。你的代碼可以做到這一點。然而,或由解析器返回的列和行號不正確的指標:(。它可能有一些做輸入到解析器是數據,而上面的代碼也適用於字符串。 – klyngbaek 2011-04-05 20:17:15

0

的NSXMLParser是相當可怕的使用。您是否嘗試過使用LibXML進行解析?然後,您可以使用XPath來查詢XML,這更簡單和更加標準的解析XML文檔的方式。

+0

我沒有,謝謝你的提示,我會了解更多。 – klyngbaek 2011-04-05 16:40:05