NSXMLDocument validateAndReturnError需要网络连接吗?

时间:2011-03-01 16:27:23

标签: cocoa xsd nsxml

我正在尝试使用NSXMLDocument针对模式(http://www.w3.org/2001/XMLSchema)的模式验证XML模式文档。我已经让它正常工作,并假设我正在验证本地架构。

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

我看到的错误

错误:没有这样的文件或目录 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':QName值'{http://www.w3.org/XML/1998/namespace}lang'不解析为(n)属性声明。

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

查看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>

这假设您将目录和架构放在同一目录中。

我自己不能尝试(缺乏时间和生锈的Cocoa技能),但它应该有效。如果我没记错的话,NSXML基于libxml2,它肯定支持目录。 目录的规格可以在OASIS website上找到。