我正在尝试使用NSXMLDocument根据模式(http://www.w3.org/2001/XMLSchema)验证XML Schema文档。我已经让它正常工作了,并假设我是在根据本地模式进行验证。
然而,我发现在没有网络连接的情况下,这种验证是不起作用的。有没有办法强制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标记:
<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“
Domain=NSXMLParserErrorDomain Code=1 UserInfo=0x103051c10“元素'{http://www.w3.org/2001/XMLSchema}import':在位置'http://www.w3.org/2001/xml.xsd'‘处定位架构失败。正在跳过导入。属性使用(未知),属性'ref':ref值’{ QName‘未解析为(N)属性声明。属性使用(未知),属性'ref':ref值’{ QName‘未解析为(N)属性声明。”
有什么想法吗?
发布于 2011-03-02 19:09:59
查看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 website上找到。
https://stackoverflow.com/questions/5157286
复制相似问题