NSXMLDocument validateAndReturnError需要网络连接?

问题描述:

我正在尝试使用NSXMLDocument针对模式架构(http://www.w3.org/2001/XMLSchema)验证XML模式文档。我已经使它正常工作,并假定我正在验证本地模式。NSXMLDocument validateAndReturnError需要网络连接?

但是,我发现没有网络连接,此验证不起作用。有没有办法强制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的一个问题。组织架构位置,但不是我公司的。

我看到

错误的错误:没有这样的文件或目录 I/O警告:未能加载外部实体 “http://www.w3.org/2001/xml.xsd”

错误域= NSXMLParserErrorDomain代码= 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':Th e QName值'{http://www.w3.org/XML/1998/namespace}lang'不解析为(n)属性声明。

任何想法?

查看NSXMLDTD类的Apple文档表明您可以访问目录。但是,似乎对定义要使用的目录的支持非常有限。您可以创建一个目录/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 website找到。