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).