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找到。