2

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

但是,我发现没有网络连接,此验证不起作用。有没有办法强制 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) 属性声明。

有任何想法吗?

4

1 回答 1

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>

这假定您在同一目录中拥有目录和架构。

我自己无法尝试(缺乏时间和生锈的可可技能),但它应该可以。如果我没记错的话,NSXML 基于当然支持目录的 libxml2。目录本身的规范可以在OASIS 网站上找到。

于 2011-03-02T11:09:58.683 回答