mam od kogoś (a raczej czegoś) taki kod (Objective-C, ale interesująca jest tylko cześć C):

        NSMutableArray *usersArray = [NSMutableArray array];
        
        int _readerOk = xmlTextReaderRead(reader);
        int _currentNodeType = xmlTextReaderNodeType(reader);
        int _currentXmlDept = xmlTextReaderDepth(reader);
        while(_readerOk && _currentNodeType != XML_READER_TYPE_NONE && _complexTypeXmlDept < _currentXmlDept) {
            BOOL handledInChild = NO;
            if(_currentNodeType == XML_READER_TYPE_ELEMENT || _currentNodeType == XML_READER_TYPE_TEXT) {
                NSString* _currentElementName = [NSString stringWithCString: (const char*) xmlTextReaderConstLocalName(reader) encoding:NSUTF8StringEncoding];
                if([@"user" isEqualToString: _currentElementName]) {
                    
                    [usersArray addObject: [[VOUserConfig alloc] initWithReader: reader]];
                    handledInChild = YES;
                    
                } else ……… // drabinka ifów
                if([@"securityPolicyConfig" isEqualToString: _currentElementName]) {
                    
                    self.securityPolicyConfig = [[VOSecurityPolicyConfig alloc] initWithReader: reader];
                    handledInChild = YES;
                    
                } else if([@"userAgentInstanceId" isEqualToString: _currentElementName]) {
                    
                    _readerOk = xmlTextReaderRead(reader);
                    _currentNodeType = xmlTextReaderNodeType(reader);
                    const char *userAgentInstanceIdElementValue = (const char*) xmlTextReaderConstValue(reader);
                    if(userAgentInstanceIdElementValue) {
                        
                        self.userAgentInstanceId = [NSString stringWithCString:userAgentInstanceIdElementValue encoding:NSUTF8StringEncoding];
                        
                    }
                    _readerOk = xmlTextReaderRead(reader);
                    _currentNodeType = xmlTextReaderNodeType(reader);
                    
                } else  {
                    [VOUnknownEntryCollector addUknownEntry: _currentElementName forObject: self];
                    // Tu jest problem
                }
            }
            
            _readerOk = handledInChild ? xmlTextReaderReadState(reader) : xmlTextReaderRead(reader);
            _currentNodeType = xmlTextReaderNodeType(reader);
            _currentXmlDept = xmlTextReaderDepth(reader);
        }
        
        if(usersArray.count) self.users = usersArray;

Ten kod ciągnie kolejne elementy xml-a i je interpretuje inicjalizując jakiś value object.
Problemem jest obsługa nieznanego node w xm-u. Taki node powinien być zignorowany i zgłoszony odpowiedni błąd.
Błąd zgłaszam, problemem jest ignorowanie node, ostatnia sekcja w drabince if-ów.
Obecnie kod natrafiając na nieznany node przetwarza wnętrze tego node'a, co powoduje zgłaszanie fałszywie pozytywnych błędów i grozi nieprawidłową interpretacją wartości.
Nie znam za bardzo libxml2, a wszelkie próby naprawienie tego przez szybkie przewertowanie dokumentacji (użycie xmlTextReaderReadInnerXml lub xmlTextReaderReadOuterXml), nie przyniosły oczekiwanego rezultatu.

Może ktoś z większym doświadczeniem z tą biblioteką nakieruje mnie jak to prawidłowo obsłużyć.

Ten kod jest generowany za pomocą xsd2cocoa, ale można go modyfikować za pocą odpowiedniego szablonu (i to jest moim celem).