Как вы получаете атрибуты Child Array, используя TFHpple? - PullRequest
0 голосов
/ 03 сентября 2010

Я использую TFHpple (который использует XPath) для разбора HTML-документа. Я могу получить содержимое различных узлов и т. Д. Но код, который я нашел на GitHub, кажется неполным. У него есть метод для получения атрибутов узла, но дочернего массива. Поэтому я написал один и не удалось. Два метода «атрибутов» ниже работают нормально. По сути, я хотел бы получить дочерний массив в качестве нового узла. Я думаю, что у меня не получается на уровне NSDictionary. Я пытался создать новый элемент TFHpple из того, что я возвращаю в "children" ниже, но ... FAIL! Любые подсказки?

Это из TFHppleElement.m:

- (NSDictionary *) attributesForNode: (NSDictionary *) myNode
{
 NSMutableDictionary *translatedAttributes = [NSMutableDictionary dictionary];
 for (NSDictionary *attributeDict in [myNode objectForKey: TFHppleNodeAttributeArrayKey]) 
 {
  //NSLog(@"attributeDict: %@", attributeDict);
  [translatedAttributes setObject: [attributeDict objectForKey: TFHppleNodeContentKey]
         forKey: [attributeDict objectForKey: TFHppleNodeAttributeNameKey]];
 }
 return translatedAttributes;
}

- (NSDictionary *) attributes
{
 return [self attributesForNode: node];
}

- (BOOL) hasChildren
{
 return [node objectForKey: TFHppleNodeChildArrayKey] != nil;
}

- (NSDictionary *) children
{
 NSMutableDictionary *translatedChildren = [NSMutableDictionary dictionary];
 for (NSDictionary *childDict in [node objectForKey: TFHppleNodeChildArrayKey]) 
 {
  [translatedChildren setObject: childDict
          forKey: [childDict objectForKey: TFHppleNodeNameKey]];
 }
 return [node objectForKey: TFHppleNodeChildArrayKey];
}

Ответы [ 2 ]

0 голосов
/ 11 апреля 2011

Добавьте следующее в ваш интерфейс / реализацию TFHppleElement:

- (NSDictionary *)children
{
    return [[node objectForKey:@"nodeChildArray"] objectAtIndex:0];
}

Затем, когда вам нужны дети:

...
FHppleElement *rowAtIndex = [xpathParser at:[NSString stringWithFormat:oddRowAtIndex,ii,x]];
...
...
TFHppleElement *children = [[TFHppleElement alloc] initWithNode:[rowAtIndex children]];
...
0 голосов
/ 08 сентября 2010

Полагаю, я все делал правильно. Но в итоге я упростил получение массива дочерних узлов как:

- (NSDictionary *) children
{
    if ([self hasChildren])
        return [[node objectForKey: TFHppleNodeChildArrayKey] objectAtIndex: 0];
    return nil;
}

Я добавил это в код TFHppleElement.m, который я скачал. Тогда я мог бы взять этот результат и создать новый узел, из которого я мог бы извлечь любые необходимые атрибуты или контент.

TFHppleElement *parentNode;
.
.
.
TFHppleElement *childNode = [[[TFHppleElement alloc] initWithNode: [parentNode children]] autorelease];
...