Цель C - Как разобрать рекурсивный узел из XML с использованием libxml2 - PullRequest
0 голосов
/ 08 декабря 2011

Ниже приведен XML с рекурсивными элементами:

<Tree>
    <Node name="books" label="books">
        <Node name="Maths" label="Maths">
            <Node name="Topic 1" label="Topic 1">
                <Node name="chapter 1" label="chapter 1"/>
                <Node name="chapter 2" label="chapter 2"/>
                <Node name="chapter 3" label="chapter 3"/>
                <Node name="chapter 4" label="chapter 4"/>
                <Node name="chapter 5" label="chapter 5"/>
            </Node>
        </Node>
        <Node name="Physics" label="Physics">
            <Node name="Topic 1" label="Topic 1">
                <Node name="chapter 1" label="chapter 1"/>
                <Node name="chapter 2" label="chapter 2"/>
                <Node name="chapter 3" label="chapter 3"/>
            </Node>
        </Node>
    </Node>
    <Node name="Pens" label="Pens">
    </Node>
</Tree>

H

Я пытался использовать следующий код для получения рекурсивных значений, но я могу получить атрибуты первого уровня, но могуне получить значение атрибута элемента "Node" второго уровня,

-(void)parse
{
        NSString *strVal = [[NSString alloc] initWithData:xmlData encoding:NSUTF8StringEncoding];

    xmlDoc * doc = xmlParseMemory(xmlData.bytes, xmlData.length);
    xmlNodePtr nodePtr =xmlDocGetRootElement(doc);
    nodePtr = nodePtr->xmlChildrenNode;
    getChild(nodePtr, (xmlChar *)"Node");

}


int recursive = 0;
void getChild(xmlNodePtr nodePtr, xmlChar *elementName)
{
    NSLog(@"recursive: %d",recursive ++);
    xmlNodePtr tempPtr = nodePtr;

    while (tempPtr!= NULL) {
        if (!xmlStrcmp(tempPtr->name, elementName)) {
            xmlChar *v = xmlGetProp(tempPtr, (const xmlChar *)"name");
            NSLog(@"element:%s field:%s val: %s",elementName, "name", v);
           // nodePtr = nodePtr->next;
        }
        tempPtr = tempPtr -> next;
    }
    xmlNodePtr nodePtr2 = nodePtr -> xmlChildrenNode;
    getChild(nodePtr2, elementName);
}

и результат:

2011-12-09 01: 12: 12.271 LibXMLParser [4123: 207] recursive: 0 2011-12-09 01: 12: 12.275 LibXMLParser [4123: 207] элемент: поле SystemNode: имя val: MSG 2011-12-09 01: 12: 12.276 LibXMLParser [4123: 207] элемент: поле SystemNode: имя val: SAP 2011-12-09 01: 12: 12.277 LibXMLParser [4123: 207] рекурсивный: 1

Может кто-нибудь дать мне ответ, как получить рекурсивный дочерний элемент узла из корня?

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

...