Получение дочерних элементов XML - включая имена тегов - PullRequest
1 голос
/ 05 апреля 2011

Я пытаюсь проанализировать XML с помощью NSXMLParser на iPhone.

Когда я обнаружу нужный элемент, я бы хотел, чтобы все было между начальным элементом и конечным элементом.

Например, учитывая:

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

Я хотел бы указать K

И получить:

    <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; 
    }
}

Заранее спасибо!

Ответы [ 2 ]

1 голос
/ 05 апреля 2011

Вероятно, вы можете использовать columnNumber, методы анализатора lineNumber, чтобы получить местоположение, где начинается ваш элемент (т.е. сохранить их как column1, line1 в didStartElement для элемента, который вы ищете), затем, когда этот элемент заканчивается, в 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 голосов
/ 05 апреля 2011

NSXmlParser довольно ужасен в использовании. Вы пытались использовать LibXML для анализа? Затем вы можете использовать XPath для запроса XML, что намного проще и является гораздо более стандартным способом анализа XML-документов.

...