NSXMLDocument validateAndReturnError требует сетевого подключения? - PullRequest
2 голосов
/ 01 марта 2011

Я пытаюсь проверить документ 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) объявление атрибута.

Есть идеи?

1 Ответ

1 голос
/ 02 марта 2011

Просмотр документов Apple для класса NSXMLDTD показывает, что у вас есть доступ к каталогам.Однако, похоже, что существует очень ограниченная поддержка для определения каталога, который будет использоваться.Либо вы можете создать каталог на /etc/xml/catalog, либо установить переменную окружения XML_CATALOG_FILES.

Получив каталог, вы сможете разместить в нем запись для схемы W3 вместе с локальной копией.Что-то вроде:

<?xml version="1.0"?>
<!DOCTYPE catalog PUBLIC "-//OASIS//DTD Entity Resolution XML Catalog V1.0//EN" 
    "http://www.oasis-open.org/committees/entity/release/1.0/catalog.dtd">
<catalog xmlns="urn:oasis:names:tc:entity:xmlns:xml:catalog">
  <system systemId="http://www.w3.org/2001/xml.xsd" uri="xml.xsd"/>  
  <uri name="http://www.w3.org/XML/1998/namespace" uri="xml.xsd"/>
</catalog>

Это предполагает, что у вас есть каталог и схема в одном каталоге.

Я не могу попробовать это сам (нехватка времени и навыки ржавого Какао), ноон должен работать.Если я правильно помню, NSXML основан на libxml2, который, безусловно, поддерживает каталоги.Спецификации самих каталогов можно найти на сайте OASIS .

...