Я пытаюсь проверить документ XML-схемы по схеме для схем (http://www.w3.org/2001/XMLSchema) с использованием NSXMLDocument. Я получил его для правильной работы и предположил, что я проверял по локальной схеме.
Однако я обнаружил, что без сетевого подключения эта проверка не работает. Есть ли способ заставить NSXMLDocument использовать локальную схему для проверки?
Код, который у меня работает с сетевым подключением:
xmlDoc = [[NSXMLDocument alloc] initWithContentsOfURL:furl options:(NSXMLDocumentValidate | NSXMLNodePreserveAll)
error:&err];
NSXMLElement *rootElement = [xmlDoc rootElement];
NSMutableArray *namespaces = [[rootElement namespaces] mutableCopy];
[namespaces addObject:[NSXMLNode namespaceWithName:@"xsi" stringValue:@"http://www.w3.org/2001/XMLSchema-instance"]];
[rootElement setNamespaces:namespaces];
[rootElement removeAttributeForName:@"xsi:schemaLocation"];
[rootElement addAttribute:[NSXMLNode attributeWithName:@"xsi:schemaLocation" stringValue:[NSString stringWithFormat:@"http://www.w3.org/2001/XMLSchema %@", @"/System/Library/Schemas/XMLSchema.xsd"]]];
BOOL vaildXML = [xmlDoc validateAndReturnError:&err];
Тег схемы документа, который я проверяю:
<schema xmlns="http://www.w3.org/2001/XMLSchema"
xmlns:myCompany="http://schema.myCompany.com/SomeSchema"
targetNamespace="http://schema.myCompany.com/SomeSchema">
Кажется, проблема в расположении схемы w3.org, но не в моей компании.
Ошибка, которую я вижу
ошибка: нет такого файла или каталога
Предупреждение ввода / вывода: не удалось загрузить внешнюю сущность "http://www.w3.org/2001/xml.xsd"
Ошибка Domain = NSXMLParserErrorDomain Code = 1 UserInfo = 0x103051c10 "Элемент" {http://www.w3.org/2001/XMLSchema}import': Не удалось найти схему в расположении 'http://www.w3.org/2001/xml.xsd'. Пропуск импорта.
использование атрибута (неизвестно), атрибут 'ref': значение QName '{http://www.w3.org/XML/1998/namespace}lang' не разрешается в (n) объявлении атрибута.
использование атрибута (неизвестно), атрибут 'ref': значение QName '{http://www.w3.org/XML/1998/namespace}lang' не преобразуется в (n) объявление атрибута.
Есть идеи?